A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张_涛 黑马帝   /  2012-6-16 19:01  /  2498 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 涅槃子衿 于 2012-6-16 20:16 编辑

public class NumberMachine {
       private NumberMachine() {
}

      private static NumberMachine instance = new NumberMachine();

      public static NumberMachine getInstance() {
             return instance;
      }

在银行业务调度系统中的号码机器类中使用了单例,明白单例模式,但是不明白单例模式的需求。
而设计模式不是为了知道原理,更是学会使用,无形中去使用。
为什么在此要使用单例模式,如果不使用会怎么样?
在这使用单例模式的需求是什么?
求指导,谢谢!
请注意一句:根据本系统来说,不要讲其他的太多,我只想知道在这个系统的需求,好不好?
谢了!

9 个回复

倒序浏览
单例模式的作用就是节约内存,在只需要一个对象就能完成的情况下,就用单例模式,以防止其他人new出N个对象来。
回复 使用道具 举报
李盼 发表于 2012-6-16 19:06
单例模式的作用就是节约内存,在只需要一个对象就能完成的情况下,就用单例模式,以防止其他人new出N个对象 ...

这个我是明白的,我需要的是单例模式在本系统中的需求。
有时候不紧紧是节约内存吧?
回复 使用道具 举报
一、什么是单例模式
单例模式(Singleton)是几个创建模式中最对立的一个,它的主要特点不是根据用户程序调用生成一个新的实例,而是控制某个类型的实例唯一性,通过下图我们知道它包含的角色只有一个,就是Singleton,它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

二、单例模式的特点
有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类也不应该被继承,如果单例类允许继承那么每个子类都可以创建实例,这就违背了Singleton模式“唯一实例”的初衷。
单例类被定义为sealed,就像前面提到的该类不应该被继承,所以为了保险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。
一个静态的变量用来保存单实例的引用。
一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。


三、单例模式的优点
实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。


四、单例模式的缺点
系统开销。虽然这个系统开销看起来很小,但是每次引用这个类实例的时候都要进行实例是否存在的检查。这个问题可以通过静态实例来解决。
开发混淆。当使用一个单例模式的对象的时候(特别是定义在类库中的),开发人员必须要记住不能使用new关键字来实例化对象。因为开发者看不到在类库中的源代码,所以当他们发现不能实例化一个类的时候会很惊讶。
对象生命周期。单例模式没有提出对象的销毁。在提供内存管理的开发语言(比如,基于.NetFramework的语言)中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。在各种开发语言中,比如C++,其它类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。


五、单例模式的适用场景
使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反之,如果一个类可以有几个实例共存,就不要使用单例模式。
不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。
不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

六、单例模式的实例
实例1:可以考虑实现单例模式的地方还有很多,例如:
1) 对于计算机的外部资源打印机的情况,因只有一个Printer Spooler,为避免两个打印作业同时输出到打印机中,可考虑用单例模式实现。
2) Window的回收站在整个系统中只有唯一的一个实例,而且回收站自行提供自己的实例,回收站也是单例模式的应用
回复 使用道具 举报
单例模式就是某个类的实例在这个程序中就一个,
就以NumberMachine 来说,如果每次调用它都要new一个这个实例,那么区号码总是取到1号,受得了吗。
就像一个市就一个正市长,如果要new出好几个正市长,你找谁,他们谁说了算。
回复 使用道具 举报
李海晓 发表于 2012-6-16 19:28
单例模式就是某个类的实例在这个程序中就一个,
就以NumberMachine 来说,如果每次调用它都要new一个这个实 ...

如果我们在ServiceWindow中声明定义一个对象后,以后每次就操作这么一个对象。
那是不是在本系统中就没有了其他的影响了呢?
回复 使用道具 举报
张_涛 黑马帝 2012-6-16 19:39:42
7#
李海晓 发表于 2012-6-16 19:28
单例模式就是某个类的实例在这个程序中就一个,
就以NumberMachine 来说,如果每次调用它都要new一个这个实 ...

如果我们在ServiceWindow中声明定义一个对象后,以后每次就操作这么一个对象。
那是不是在本系统中就没有了其他的影响了呢?
回复 使用道具 举报
这个类相当号码管理器产生机器,从它可以获得不同的客户的号码管理器如普通,快速,vip。在银行中一种的号码管理器就应该有一个吧,从这个类的对象获得不同种类型号码管理器,而且一种号码管理器应唯一,不能在从这个类的其他对象再获得号码管理器(像要是有2个产生普通客户的号码管理器就乱套了),那就要保证这个类对象就一个,就应是单例
回复 使用道具 举报
张_涛 黑马帝 2012-6-16 20:15:39
9#
赵孟恩 发表于 2012-6-16 19:48
这个类相当号码管理器产生机器,从它可以获得不同的客户的号码管理器如普通,快速,vip。在银行中一种的号 ...

OK
明白了,本来有点模糊,所以看看大家的看法。
谢了。
回复 使用道具 举报
不太懂你要说什么.许多类想操作同一个A类的实例对象a.如果要操作a.就的先new A.就会操作不同对象.那就乱啦.所以不关在那个方法那个类.只要得到同一个a就好办.单例模式就来啦.不关那个类调用a都反回同一个对象引用.手机发的.比较乱.见谅 
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马