锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-08
如果构造方法是 protected 的话。单例的最大意义应该就是继承了。JDK 里面很多单例都是子类保护的。
如果是 private 的话。意义不大。 而且,如果 用 private static Singleton instance = null; 这样的形似。还有一个意义就是延迟加载。 如果不用单例,那势必所以的初始化都必须写在 静态块 里面。 而如果用单例,在某些系统中,我不需要调用单例对象,只需要执行类的某些 静态方法。就不会执行初始化。 |
|
返回顶楼 | |
发表时间:2009-06-08
最后修改:2009-06-08
我感觉有三个理由:
1) 类可能需要实现接口。比如说,我有一个接口I,类C1和C2都需要实现接口I而且还只能有一个实例,这时候就不能用工具类来实现。 2) 如何测试,如何mock你的单例?这个可能仍然和接口有关。 3) 单例这个名字可能有一点误导。 如果我想保证一个类只有两个(或三个。。。)实例怎么办?比方说我想自己实现一个Bool类。 最后,没有实例的类应该确实也是单例模式的一种实现方式吧 |
|
返回顶楼 | |
发表时间:2009-06-08
通过单例模式和类的静态方法都可以达到目的。
个人觉得没有必要过于去深究这个东东。 |
|
返回顶楼 | |
发表时间:2009-06-08
spider-dog 写道 如果我想保证一个类只有两个(或三个。。。)实例怎么办?比方说我想自己实现一个Bool类。
你可以用 java 的 枚举类型(enum) 来自己实现Bool类 |
|
返回顶楼 | |
发表时间:2009-06-08
abc130314 写道 如果构造方法是 protected 的话。单例的最大意义应该就是继承了。JDK 里面很多单例都是子类保护的。
如果是 private 的话。意义不大。 而且,如果 用 private static Singleton instance = null; 这样的形似。还有一个意义就是延迟加载。 如果不用单例,那势必所以的初始化都必须写在 静态块 里面。 而如果用单例,在某些系统中,我不需要调用单例对象,只需要执行类的某些 静态方法。就不会执行初始化。 单例的继承请举例说明一下,以及它的优势 静态类的一些初始化工作 可以不在加载时进行 我也可以定义一个静态初始化方法 来做一些 初始化工作,不一定在加载时就把所有初始化工作 都做了。 |
|
返回顶楼 | |
发表时间:2009-06-08
确实有时也应该质疑一下设计模式
|
|
返回顶楼 | |
发表时间:2009-06-08
最后修改:2009-06-08
呵呵 这个问题我也曾经考虑过 最后得到到结论是:只有一个实例和没有实例其实没什么差别。
|
|
返回顶楼 | |
发表时间:2009-06-08
你们都是神一样的人……
回去做C开发吧 |
|
返回顶楼 | |
发表时间:2009-06-08
例如,现在引用一个新的库,而现在需要扩展,或者修改其中一个类的功能。
而如果这个类全是用静态方法写的。除了修改源代码。很难实现。 但是如果用的单例,直接继承就可以了。这样可以完全体现对象的特征。 这是相对于,为什么用单例,而不用全静态方法的好处。(一般工具类,没有这么复杂的要求。所以一般没必要用单例。) 使用单例,就是确定了系统只用一个对象。或者说是大多数的系统都只需要引用一个对象。然后,方便你不再需要把这个对象 new 出来,再用一个方法或一个字段去引用。 一般我的标准是,如果一个类里面有多个方法调用同一个属性。那我一定会用单例。 如果所有的方法都只需要调用一个属性,或者不需要。那我绝对写成工具类。 |
|
返回顶楼 | |
发表时间:2009-06-08
现在手写单例往往等于反模式,不要再纠缠了……
|
|
返回顶楼 | |