单身模式

Muh*_*hit 19 singleton design-patterns

我们什么时候应该使用Singleton模式?为什么?

Mik*_*ney 25

http://sites.google.com/site/steveyegge2/singleton-considered-stupid

为什么Singleton如此吸引人?我是第一个承认:我也喜欢它.不,刮伤 - 我喜欢 Singleton.从我看到它的那一刻起,它就像一位老朋友.它简单而美丽.

我会告诉你原因:这是因为Singleton模式是非OO编程的回归.对于那些不理解"四人帮"试图说出的单词的人来说,这是一条生命线.我不知道它是如何进入那里的 - 毫无疑问是一些政治上的OOPSLA压力 - 但它并不属于那里.这是邪恶......

这是"简短"摘要......

a)我甚至没有涵盖十分之一的问题.但我会举几个例子.

b)一个是内存管理; Singleton基本上只是一个内存泄漏,如果没有人会在一段时间内使用它.但你不知道何时解除它,因为没有人会打电话给你并说"没有人会在一段时间内使用你!"

此外,你不能告诉谁一直保留对你的Singleton实例的引用,因为你非常想把它交出去,不是吗?(注意:Java的弱引用可以帮助解决这个问题).

c)说到内存泄漏,如果您的Singleton具有某些有限资源(如数据库或文件句柄)的句柄,该怎么办?我想你可以保持这个吸盘打开,直到你的程序结束.感谢上帝C++程序在崩溃之前的持续时间不会超过大约10分钟,通常是资源耗尽,或者试图访问某人释放的单身人士.

d)另一个问题是Singleton设计在语法上是嘈杂的; 大多数语言都不支持它(好吧,Ruby确实如此,但这可能在Matz知道更好之前),所以你不仅要在Singleton中使用样板代码,而且要在每个使用它的人身上.

e)然后是子类化的东西.将Singleton子类化几乎是不可能的,如果你管理它,那么你不应该首先使用Singleton.你甚至不想去那里.我走过了一条我不敢讲述的道路.只是假装你做不到,你会为自己节省大量的痛苦.

f)静态方法与花岗岩一样灵活.每次使用一个,你都会在具体的时候投入你的程序的一部分.当你看着它变硬时,确保你的脚没有卡在那里.有一天,你会惊讶地发现,通过天哪,你真的需要另一个实现那个dang PrintSpooler类,它应该是一个接口,一个工厂和一组实现类.D'哦!

不要以为这就是全部.还有许多其他问题.例如,尝试添加多线程并查看会发生什么.好吧,我会告诉你会发生什么:有一段时间,你得到一个Doubleton或Tripleton,除非你是同步专家,并且拥有一个Tripleton就像在你的茶话会上出现三个Balrogs一样令人满意.即使你是一名同步专家并且正确地使用了双重检查成语,你仍然需要处理一个Balrog,而且他们不会野餐.

但是,与Big One相比,这些问题都变得微不足道,这就是Singleton"模式"鼓励你忘记你所知道的关于OO设计的一切,因为OO很难,而且程序很容易......

  • 很搞笑,这是我得票最高的答案之一:) (2认同)

小智 6

Java RunnableSingleton模式的最佳示例.如果要添加不允许创建特定类的单个实例的限制,则最好实现 Singleton模式.实施单身人士的要点:

  • 私人建设者
  • Singleton类的静态私有实例变量本身
  • 公共getter方法只在第一次初始化上面的变量时,总是返回Singleton类的同一个实例.

    class Singleton {
    
          private static Singleton instance;
    
          private Singleton(){
          }
    
          public static Singleton getInstance(){
             if(instance=null){
                instance=new Singleton();
             }
    
             return instance;
          }
          ........
        }
    
    Run Code Online (Sandbox Code Playgroud)

    对于线程安全:需要同步getInstance().


dcp*_*dcp 5

如果您遇到只需要一个对象来协调整个系统的操作的情况,那么您可以使用此模式.一个很好的例子是Facade,也就是说,Facades可以作为单例实现,因为整个系统通常需要一个Facade对象.

但总的来说,这通常是一种不好的做法,应该避免,一个重要原因是它极大地抑制了可扩展性.


Joh*_*ley 2

理论上:当您需要将对象的实例化限制为一个实例时。实际上:从来没有。