锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-07
最后修改:2009-06-09
为什么需要 单例设计模式(Singleton)? 像下面的一个单例
public class Singleton { private static Singleton instance = null; private Singleton(){}; public static synchronized Singleton getInstance(){ if(instance == null) instance = new Singleton(); return instance; } public void doSomething(){ //do something } } 它要实现的主要目标,就是在一个应用中只维护一个Singleton实例 但一个类在一个应用中也是唯一的,为什么不能直接以类作为单例呢?
public final class AnotherSingleton{ private AnotherSingleton(){} public static synchronized void doSomething(){ //do something } }
把类的所有方法都改为静态方法, 所有属性都改为静态属性(我们可以把 静态属性看成类的内部状态), 但是不允许实例化, 对类的操作相当于对单例的操作 而且类也可以维护内部状态(通过静态私有属性) 这完全满足了单例的要求。 不知道为什么需要单例模式。。。 因为我想不出来在什么情况下 单例可以满足需求 而 类 不能。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-07
确实 ,
好像单例的特性都可以通过类的静态方法和静态属性实现。 |
|
返回顶楼 | |
发表时间:2009-06-07
什么都写成静态的,你干嘛不用C
|
|
返回顶楼 | |
发表时间:2009-06-07
wendong007 写道 什么都写成静态的,你干嘛不用C C 的好特性 当然值得借鉴 java 的语法就是类 C 的 如果只有静态方法,那确实是面向过程 但类也可以有状态(静态属性) 所以我们 也可以把一个JAVA类当成一个对象 一个全局唯一的对象 这不就是Singleton吗 不过从表面上看他不是实例,而是一个类。。 |
|
返回顶楼 | |
发表时间:2009-06-07
将类定义为final吧
|
|
返回顶楼 | |
发表时间:2009-06-07
楼主的想法近似于MonoState模式,将所有的实例变量变成静态的,从而保证对这些变量所带来的行为进行强制单一性。
而Singleton是通过强制结构上的单一性,防止创建出多个对象实例。 这两种模式在bob martin的敏捷软件开发一书有一章曾经介绍过,楼主可以查阅该章节。 这两种方法各有千秋,不过综合来说Singleton的灵活性更大一点。 |
|
返回顶楼 | |
发表时间:2009-06-07
至于静态方法的话,是会限制了多态,所以很多情况在oo编程中它是不被用的,除非你确定你的类完全不需要,不可能使用到多态,比如像工具类,或者像active record里面的那些find方法,很多时候技术并没有对错,只是适合不适合和你是否需要一些oo的灵活性了。
|
|
返回顶楼 | |
发表时间:2009-06-07
这样会损失面向对象的特性
|
|
返回顶楼 | |
发表时间:2009-06-07
最后修改:2009-06-07
我觉得单例的原因是类型不能当对象用。
譬如函数传参数时你得传个对象或值,不能传类型。 所以把 static 的东西都改成非 static 的,强制只能实例化一遍,传递唯一的实例,就能模拟“传递类型”的效果了。另外 static 成员在继承的时候一坨乱糟糟也是个原因。 |
|
返回顶楼 | |
发表时间:2009-06-07
楼主问得好,这问题困惑小的多时,期待有大大完整解答一个
kaka11 写道 至于静态方法的话,是会限制了多态,所以很多情况在oo编程中它是不被用的,除非你确定你的类完全不需要,不可能使用到多态,比如像工具类,或者像active record里面的那些find方法,很多时候技术并没有对错,只是适合不适合和你是否需要一些oo的灵活性了。
常见的单例模式实现方法由于把构造器设为private,一样限制了多态,而且它的方法一般以实例方法为主,比静态方法慢。据说单例模式比静态类容易测试,因为有办法mock |
|
返回顶楼 | |