锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-08
abc130314 写道 例如,现在引用一个新的库,而现在需要扩展,或者修改其中一个类的功能。
而如果这个类全是用静态方法写的。除了修改源代码。很难实现。 但是如果用的单例,直接继承就可以了。这样可以完全体现对象的特征。 这是相对于,为什么用单例,而不用全静态方法的好处。(一般工具类,没有这么复杂的要求。所以一般没必要用单例。) 使用单例,就是确定了系统只用一个对象。或者说是大多数的系统都只需要引用一个对象。然后,方便你不再需要把这个对象 new 出来,再用一个方法或一个字段去引用。 一般我的标准是,如果一个类里面有多个方法调用同一个属性。那我一定会用单例。 如果所有的方法都只需要调用一个属性,或者不需要。那我绝对写成工具类。 你讲的是类继承对对象来说产生的益处 而不是 类继承对 单例(一种特殊对象,全局唯一) 来说产生的益处 |
|
返回顶楼 | |
发表时间:2009-06-08
这个东西涉及到 Singleton 跟 MonoState .
前段时间我们也讨论过. 不过像Math这种工具类. 它实际没有存在对象的必要. 这时就没有必要单例. 并且大量的static的方法. 实际上是一种面向对象的倒退. 我们可以写一个Gui程序. 在菜单用Singleton . 能把它写成纯 static的嘛? 我觉得使他丧失了很多东西. 不值得... |
|
返回顶楼 | |
发表时间:2009-06-08
Saito 写道 这个东西涉及到 Singleton 跟 MonoState .
前段时间我们也讨论过. 不过像Math这种工具类. 它实际没有存在对象的必要. 这时就没有必要单例. 并且大量的static的方法. 实际上是一种面向对象的倒退. 我们可以写一个Gui程序. 在菜单用Singleton . 能把它写成纯 static的嘛? 我觉得使他丧失了很多东西. 不值得... 注意我前面的 AnotherSingleton 的构造函数是私有的 而 MonoState 的的构造函数是共有的 MonoState 和 Singleton 看起来很相似 但他们体现了不同的设计动机 MonoState 可以被大量实例化 (被实例化的对象 享有共同的 类状态), 而 Singleton 就 只有一个 (它体现的是 全局的应用状态 ) |
|
返回顶楼 | |
发表时间:2009-06-08
忘掉模式吧。单例的目的只是体现设计者的思路而已。设计师只是想说:这个类在这个系统里应该只有一个实例。就像一把防君子不防小人的锁,后人要hack也是可以的。
仅此而已。不必拘泥。 |
|
返回顶楼 | |
发表时间:2009-06-08
在getInstance()需要做init()的时候,改成静态方法就无法做到
|
|
返回顶楼 | |
发表时间:2009-06-08
hatedance 写道 忘掉模式吧。单例的目的只是体现设计者的思路而已。设计师只是想说:这个类在这个系统里应该只有一个实例。就像一把防君子不防小人的锁,后人要hack也是可以的。
仅此而已。不必拘泥。 “忘掉模式吧。” 呵呵 , 这句话听着太耳熟 “忘掉模式吧。”实际上是对滥用模式的一种感慨, 应该说“不要刻意追究模式” 模式不是一个类应该有几个实例的问题,我们不玩代码魔术 模式不是一把锁,而是一条路,后人可以走这条路, 也可以另觅蹊径 。 |
|
返回顶楼 | |
发表时间:2009-06-08
步行者 写道 Saito 写道 这个东西涉及到 Singleton 跟 MonoState .
前段时间我们也讨论过. 不过像Math这种工具类. 它实际没有存在对象的必要. 这时就没有必要单例. 并且大量的static的方法. 实际上是一种面向对象的倒退. 我们可以写一个Gui程序. 在菜单用Singleton . 能把它写成纯 static的嘛? 我觉得使他丧失了很多东西. 不值得... 注意我前面的 AnotherSingleton 的构造函数是私有的 而 MonoState 的的构造函数是共有的 MonoState 和 Singleton 看起来很相似 但他们体现了不同的设计动机 MonoState 可以被大量实例化 (被实例化的对象 享有共同的 类状态), 而 Singleton 就 只有一个 (它体现的是 全局的应用状态 ) 你的AnotherSingleton无论私有或共有. 实际上是没有任何意义的. 既然他们是相同的. 那你去实例化多个有什么意义. 唯一的好处是给别人提醒一下. 别浪费. 但是一般看了api的人应该都不会那么傻. . 就跟你见过有人有事没事就实例化几个Math么? 全局的应用状态. 一般这样来说. 对象是可以保存状态的. 而Math这种东西一般没有状态. 这也是Singleton跟Monostate的最根本区别. Singleton我是用来用他那个instance的. 而Monostate.我用的只是那个class. . |
|
返回顶楼 | |
发表时间:2009-06-08
Saito 写道 你的AnotherSingleton无论私有或共有. 实际上是没有任何意义的. 既然他们是相同的. 那你去实例化多个有什么意义. 唯一的好处是给别人提醒一下. 别浪费. 但是一般看了api的人应该都不会那么傻. . 就跟你见过有人有事没事就实例化几个Math么? 全局的应用状态. 一般这样来说. 对象是可以保存状态的. 而Math这种东西一般没有状态. 这也是Singleton跟Monostate的最根本区别. Singleton我是用来用他那个instance的. 而Monostate.我用的只是那个class. . 注意 AnotherSingleton 不能实例化 而 MonoState 是可以用来实例化的 如果MonoState 不能实例化 那他就和 AnotherSingleton 一样的了 关于AnotherSingleton 和MonoState 的设计动机 请看我上次给你的回复 |
|
返回顶楼 | |
发表时间:2009-06-08
ms .. 你没看懂我给你的回复. .
请看你引用我的回复.. 我再次强调. AnotherSingleton 能不能实例化没关系.. 理由同Math .. 似乎楼主还在为自己创造了一个新的模式而欣喜 . 一种介乎与Singleton跟Monostate的新模式. 实际上掉入了Monostate 能实例化跟不能实例化的怪圈. 实际上Monostate没人傻到要去实例化他. 当然. 你去private他也是有好处的. 告诫别人别做傻事. |
|
返回顶楼 | |
发表时间:2009-06-08
Saito 写道 ms .. 你没看懂我给你的回复. .
请看你引用我的回复.. 我再次强调. AnotherSingleton 能不能实例化没关系.. 理由同Math .. 似乎楼主还在为自己创造了一个新的模式而欣喜 . 一种介乎与Singleton跟Monostate的新模式. 实际上掉入了Monostate 能实例化跟不能实例化的怪圈. 实际上Monostate没人傻到要去实例化他. 当然. 你去private他也是有好处的. 告诫别人别做傻事. 我问你 Math 有内部私有状态吗 其他的不多说了 我不是创建模式 而是讨论模式 |
|
返回顶楼 | |