锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-07
如果单例对象需要 a. 从反序列化得来, b. 用Spring这样的框架装配而成,c. 根据实际的运行环境,向单例的构造函数传递不同的参数,那么使用类的静态成员就是不合适的。如果没有这些要求,以类为单例是足够了。
|
|
返回顶楼 | |
发表时间:2009-06-07
确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全 |
|
返回顶楼 | |
发表时间:2009-06-07
fjlyxx 写道 将类定义为final吧 为什么要将类定义为 final 呢 即使被其他类继承 ,它的状态还是唯一的 它的子类可以使用父类的静态方法和静态属性 ,却不会在内存中创造一份父类静态方法和静态 属性的的拷贝, 类的状态是唯一的,不能通过继承复制它,只能 通过特定接口访问它 |
|
返回顶楼 | |
发表时间:2009-06-07
最后修改:2009-06-07
把构造函数私有化的那步放到最终具体类中,依然能用多态啊。
原型的对象系统就没这个问题,既然没有 class,就没有特意弄 singleton 的必要了。 引用 In a prototype-based programming language, where objects but not classes are used, a "singleton" simply refers to an object without copies or that is not used as the prototype for any other object. Example in Io:
Foo := Object clone Foo clone := Foo |
|
返回顶楼 | |
发表时间:2009-06-07
frenchmay 写道 确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全 线程安全很重要,但这不是讨论的重点 问题是 单例能线程安全 ,类也能线程安全啊。 为什么用单例 而 不用用静态属性和静态方法构造的类 来表达这种唯一性呢? |
|
返回顶楼 | |
发表时间:2009-06-07
最后修改:2009-06-07
步行者 写道 frenchmay 写道 确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全 线程安全很重要,但这不是讨论的重点 问题是 单例能线程安全 ,类也能线程安全啊。 为什么用单例 而 不用用静态属性和静态方法构造的类 来表达这种唯一性呢? 感觉不到好处就别用。不要成为 Stinkleton。 另外用 DI 就已经很方便了,现在手写 singleton 已经成为反模式了…… |
|
返回顶楼 | |
发表时间:2009-06-07
楼主的做法是单了,可惜没有"例"
静态属性和静态方法的做法不是说不可以达到目标,只是这样做初始化工作就交给了JVM,这样的做法基本丧失了主控性,也不利于测试,那么既然单例的做法更好,何乐不为呢? |
|
返回顶楼 | |
发表时间:2009-06-07
treenode 写道 如果单例对象需要 a. 从反序列化得来, b. 用Spring这样的框架装配而成,c. 根据实际的运行环境,向单例的构造函数传递不同的参数,那么使用类的静态成员就是不合适的。如果没有这些要求,以类为单例是足够了。
你的这三种情况 是针对对象的,因为类不是对象,确实不能满足。 不过类可以通过其他途径满足 这三种情况所要达到的目的。 a , 对象序列化 确实不保存 静态属性,但类的内部状态不是不可以保存并恢复的。 b , Spring 容器是管理对象的,当然不能管理类,类也不需要管理,因为它只有一个 索引它只需要类名就可以了。 c , 对象才有构造函数 ,类当然没有。但类可以使用静态初始化方法初始化类的内部状态。 |
|
返回顶楼 | |
发表时间:2009-06-07
flyspider 写道 楼主的做法是单了,可惜没有"例"
静态属性和静态方法的做法不是说不可以达到目标,只是这样做初始化工作就交给了JVM,这样的做法基本丧失了主控性,也不利于测试,那么既然单例的做法更好,何乐不为呢? 如果对象不是单例,这种说法我就接受了 因为对象是单例,它的初始化实际上分为两步的: 1,加载单例对应的类 2,创建一个单例 而类也只会被加载一次,而且不一定非要在加载时 把所有的初始化工作都做了。 我们也可以在使用前做初始化工作。 所以我不觉得这是单例的优势! |
|
返回顶楼 | |
发表时间:2009-06-07
最后修改:2009-06-07
楼主,你说的其实没问题,单例就是一个全局访问点,用全部是静态变量和静态方法的类来做同样可以。我看过这样的讨论,最后的结论是单例模式比之全静态类来说唯一的好处就是,你可以很容易将单例改成多实例,这个理由很薄弱。
|
|
返回顶楼 | |