论坛首页 Java企业应用论坛

为什么需要Singleton

浏览 48287 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-08  
如果构造方法是 protected 的话。单例的最大意义应该就是继承了。JDK 里面很多单例都是子类保护的。
如果是 private 的话。意义不大。
而且,如果 用 private static Singleton instance = null; 这样的形似。还有一个意义就是延迟加载。
如果不用单例,那势必所以的初始化都必须写在 静态块 里面。
而如果用单例,在某些系统中,我不需要调用单例对象,只需要执行类的某些 静态方法。就不会执行初始化。
0 请登录后投票
   发表时间:2009-06-08   最后修改:2009-06-08
我感觉有三个理由:
1) 类可能需要实现接口。比如说,我有一个接口I,类C1和C2都需要实现接口I而且还只能有一个实例,这时候就不能用工具类来实现。
2) 如何测试,如何mock你的单例?这个可能仍然和接口有关。
3) 单例这个名字可能有一点误导。 如果我想保证一个类只有两个(或三个。。。)实例怎么办?比方说我想自己实现一个Bool类。

最后,没有实例的类应该确实也是单例模式的一种实现方式吧
1 请登录后投票
   发表时间:2009-06-08  
通过单例模式和类的静态方法都可以达到目的。

个人觉得没有必要过于去深究这个东东。
0 请登录后投票
   发表时间:2009-06-08  
spider-dog 写道
如果我想保证一个类只有两个(或三个。。。)实例怎么办?比方说我想自己实现一个Bool类。

你可以用 java 的 枚举类型(enum) 来自己实现Bool类

0 请登录后投票
   发表时间:2009-06-08  
abc130314 写道
如果构造方法是 protected 的话。单例的最大意义应该就是继承了。JDK 里面很多单例都是子类保护的。
如果是 private 的话。意义不大。
而且,如果 用 private static Singleton instance = null; 这样的形似。还有一个意义就是延迟加载。
如果不用单例,那势必所以的初始化都必须写在 静态块 里面。
而如果用单例,在某些系统中,我不需要调用单例对象,只需要执行类的某些 静态方法。就不会执行初始化。


单例的继承请举例说明一下,以及它的优势

静态类的一些初始化工作 可以不在加载时进行
我也可以定义一个静态初始化方法 来做一些
初始化工作,不一定在加载时就把所有初始化工作
都做了。

0 请登录后投票
   发表时间:2009-06-08  
确实有时也应该质疑一下设计模式
0 请登录后投票
   发表时间:2009-06-08   最后修改:2009-06-08
呵呵 这个问题我也曾经考虑过 最后得到到结论是:只有一个实例和没有实例其实没什么差别。
0 请登录后投票
   发表时间:2009-06-08  
你们都是神一样的人……

回去做C开发吧
0 请登录后投票
   发表时间:2009-06-08  
例如,现在引用一个新的库,而现在需要扩展,或者修改其中一个类的功能。
而如果这个类全是用静态方法写的。除了修改源代码。很难实现。
但是如果用的单例,直接继承就可以了。这样可以完全体现对象的特征。
这是相对于,为什么用单例,而不用全静态方法的好处。(一般工具类,没有这么复杂的要求。所以一般没必要用单例。)

使用单例,就是确定了系统只用一个对象。或者说是大多数的系统都只需要引用一个对象。然后,方便你不再需要把这个对象 new 出来,再用一个方法或一个字段去引用。

一般我的标准是,如果一个类里面有多个方法调用同一个属性。那我一定会用单例。
如果所有的方法都只需要调用一个属性,或者不需要。那我绝对写成工具类。
0 请登录后投票
   发表时间:2009-06-08  
现在手写单例往往等于反模式,不要再纠缠了……
3 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics