单例模式是GoF模式书中一个完全付费的成员,但最近它似乎被开发人员世界孤立了。我仍然使用了相当多的单线程,特别是对于工厂类,虽然你必须对多线程问题(像任何类一样)小心一点,但我不明白为什么它们如此糟糕。
Stack Overflow似乎特别假设每个人都认为Singleton是邪恶的。为什么?
请用“事实、参考资料或具体专业知识”来支持您的回答
单例模式是GoF模式书中一个完全付费的成员,但最近它似乎被开发人员世界孤立了。我仍然使用了相当多的单线程,特别是对于工厂类,虽然你必须对多线程问题(像任何类一样)小心一点,但我不明白为什么它们如此糟糕。
Stack Overflow似乎特别假设每个人都认为Singleton是邪恶的。为什么?
请用“事实、参考资料或具体专业知识”来支持您的回答
当前回答
我认为这种混乱是因为人们不知道Singleton模式的真正应用。我再怎么强调也不为过。Singleton不是包装全局变量的模式。Singleton模式只应用于确保在运行时存在给定类的一个且只有一个实例。
人们认为辛格尔顿是邪恶的,因为他们在全球范围内使用它。正是因为这种困惑,辛格尔顿被人看不起。请不要混淆Singleton和globals。如果用于预期用途,您将从Singleton模式中获得极大的好处。
其他回答
Vince Huston有这些标准,在我看来很合理:
只有满足以下三个标准时,才应考虑Singleton:无法合理分配单个实例的所有权需要延迟初始化未提供全局访问如果单个实例的所有权、初始化发生的时间和方式以及全局访问都不是问题,那么Singleton就不够有趣了。
来自谷歌的Misko Hevery就这个话题发表了一些有趣的文章。。。
单身者是病态的骗子。有一个单元测试示例,说明了单身者如何难以找出依赖链并启动或测试应用程序。这是一个相当极端的虐待例子,但他提出的观点仍然有效:
单身者无非是全球国家。全局状态使您的对象可以秘密地获取未在其API中声明的内容,因此,Singleton会将您的API变成病态的骗子。
所有的Singleton都去哪儿了,这表明依赖注入使得向需要实例的构造函数提供实例变得容易,这减轻了第一篇文章中谴责的糟糕的全局Singleton背后的潜在需求。
假设该模式用于模型的某个方面,而该方面是真正的单一模式,则该模式没有本质上的错误。
我认为这种反弹是由于它的过度使用,而这反过来又是因为它是最容易理解和实施的模式。
如果你使用得当且最少,单身汉并不是邪恶的。还有很多其他好的设计模式可以在某一点上替代单例的需求(也可以提供最佳结果)。但是一些程序员不知道这些好模式,在所有情况下都使用单例模式,这使得单例模式对他们来说是有害的。
一些代码势利者看不起他们,认为他们只是一个荣耀的全球人。就像许多人讨厌goto语句一样,也有其他人讨厌使用全局的想法。我见过几位开发人员为了避免全局性而竭尽全力,因为他们认为使用全局性是失败的承认。奇怪但真实。
在实践中,Singleton模式只是一种编程技术,它是概念工具包的有用部分。有时你可能会发现它是理想的解决方案,所以使用它。但使用它只是为了吹嘘使用设计模式,就像拒绝使用它一样愚蠢,因为它只是一个全球性的。