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很难,而且程序很容易......
小智 6
Java Runnable是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().
如果您遇到只需要一个对象来协调整个系统的操作的情况,那么您可以使用此模式.一个很好的例子是Facade,也就是说,Facades可以作为单例实现,因为整个系统通常需要一个Facade对象.
但总的来说,这通常是一种不好的做法,应该避免,一个重要原因是它极大地抑制了可扩展性.