论坛首页 Java企业应用论坛

为什么需要Singleton

浏览 48292 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-08  
abc130314 写道
例如,现在引用一个新的库,而现在需要扩展,或者修改其中一个类的功能。
而如果这个类全是用静态方法写的。除了修改源代码。很难实现。
但是如果用的单例,直接继承就可以了。这样可以完全体现对象的特征。
这是相对于,为什么用单例,而不用全静态方法的好处。(一般工具类,没有这么复杂的要求。所以一般没必要用单例。)

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

一般我的标准是,如果一个类里面有多个方法调用同一个属性。那我一定会用单例。
如果所有的方法都只需要调用一个属性,或者不需要。那我绝对写成工具类。


你讲的是类继承对对象来说产生的益处
而不是 类继承对 单例(一种特殊对象,全局唯一) 来说产生的益处

0 请登录后投票
   发表时间:2009-06-08  
这个东西涉及到 Singleton 跟 MonoState .

   前段时间我们也讨论过. 不过像Math这种工具类. 它实际没有存在对象的必要. 这时就没有必要单例.
   并且大量的static的方法. 实际上是一种面向对象的倒退.

   我们可以写一个Gui程序. 在菜单用Singleton . 能把它写成纯 static的嘛? 我觉得使他丧失了很多东西. 不值得...
0 请登录后投票
   发表时间:2009-06-08  
Saito 写道
这个东西涉及到 Singleton 跟 MonoState .

   前段时间我们也讨论过. 不过像Math这种工具类. 它实际没有存在对象的必要. 这时就没有必要单例.
   并且大量的static的方法. 实际上是一种面向对象的倒退.

   我们可以写一个Gui程序. 在菜单用Singleton . 能把它写成纯 static的嘛? 我觉得使他丧失了很多东西. 不值得...


注意我前面的 AnotherSingleton 的构造函数是私有的
而 MonoState 的的构造函数是共有的

MonoState 和 Singleton 看起来很相似
但他们体现了不同的设计动机
MonoState 可以被大量实例化 (被实例化的对象 享有共同的 类状态),
而 Singleton 就 只有一个 (它体现的是 全局的应用状态 )
0 请登录后投票
   发表时间:2009-06-08  
忘掉模式吧。单例的目的只是体现设计者的思路而已。设计师只是想说:这个类在这个系统里应该只有一个实例。就像一把防君子不防小人的锁,后人要hack也是可以的。

仅此而已。不必拘泥。
0 请登录后投票
   发表时间:2009-06-08  
在getInstance()需要做init()的时候,改成静态方法就无法做到
0 请登录后投票
   发表时间:2009-06-08  
hatedance 写道
忘掉模式吧。单例的目的只是体现设计者的思路而已。设计师只是想说:这个类在这个系统里应该只有一个实例。就像一把防君子不防小人的锁,后人要hack也是可以的。

仅此而已。不必拘泥。


“忘掉模式吧。”
呵呵 , 这句话听着太耳熟
“忘掉模式吧。”实际上是对滥用模式的一种感慨,
应该说“不要刻意追究模式”

模式不是一个类应该有几个实例的问题,我们不玩代码魔术

模式不是一把锁,而是一条路,后人可以走这条路,
也可以另觅蹊径 。
0 请登录后投票
   发表时间: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.  .
0 请登录后投票
   发表时间:2009-06-08  
Saito 写道


   你的AnotherSingleton无论私有或共有. 实际上是没有任何意义的.

   既然他们是相同的. 那你去实例化多个有什么意义.  唯一的好处是给别人提醒一下. 别浪费. 但是一般看了api的人应该都不会那么傻. .

   就跟你见过有人有事没事就实例化几个Math么?

   全局的应用状态. 一般这样来说. 对象是可以保存状态的. 而Math这种东西一般没有状态. 这也是Singleton跟Monostate的最根本区别.  Singleton我是用来用他那个instance的. 而Monostate.我用的只是那个class.  .




注意 AnotherSingleton 不能实例化
而 MonoState 是可以用来实例化的
如果MonoState 不能实例化 那他就和
AnotherSingleton 一样的了

关于AnotherSingleton 和MonoState
的设计动机 请看我上次给你的回复
0 请登录后投票
   发表时间:2009-06-08  
ms .. 你没看懂我给你的回复. .

  请看你引用我的回复.. 

  我再次强调. AnotherSingleton 能不能实例化没关系.. 理由同Math ..

  似乎楼主还在为自己创造了一个新的模式而欣喜 . 一种介乎与Singleton跟Monostate的新模式. 实际上掉入了Monostate 能实例化跟不能实例化的怪圈. 实际上Monostate没人傻到要去实例化他. 当然. 你去private他也是有好处的. 告诫别人别做傻事.
0 请登录后投票
   发表时间:2009-06-08  
Saito 写道
ms .. 你没看懂我给你的回复. .

  请看你引用我的回复.. 

  我再次强调. AnotherSingleton 能不能实例化没关系.. 理由同Math ..

  似乎楼主还在为自己创造了一个新的模式而欣喜 . 一种介乎与Singleton跟Monostate的新模式. 实际上掉入了Monostate 能实例化跟不能实例化的怪圈. 实际上Monostate没人傻到要去实例化他. 当然. 你去private他也是有好处的. 告诫别人别做傻事.


我问你 Math 有内部私有状态吗
其他的不多说了

我不是创建模式 而是讨论模式

0 请登录后投票
论坛首页 Java企业应用版

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