单身模式是GoF 模式书的完全付费成员,但它最近似乎是开发者世界的孤儿。我仍然使用相当多的单例,特别是对于工厂类 ,虽然你必须对多线程问题(实际上像任何类)一样小心,但我不明白为什么它们如此可怕。
Stack Overflow 特别假设每个人都同意 Singletons 是邪恶的。为什么?
请用 “ 事实,参考或具体专业知识 ” 支持您的答案
从 Brian Button 转述:
它们通常用作全局实例,为什么这么糟糕?因为您在代码中隐藏了应用程序的依赖关系,而不是通过接口公开它们。制作一些全局的东西以避免传递它是一种代码味道 。
它们违反了单一责任原则 :由于它们控制着自己的创造和生命周期。
它们固有地导致代码紧密耦合 。在许多情况下,这使得将它们伪装在测试中相当困难。
它们在应用程序的生命周期中携带状态。测试的另一个打击因为你可能最终会遇到需要订购测试的情况,这对于单元测试来说是一个很大的决定。为什么?因为每个单元测试应该独立于另一个。
单身人士解决了一个(也是唯一一个)问题。
资源争用。
如果你有一些资源
( 1 )只能有一个实例,而且
( 2 )你需要管理那个单一的实例,
你需要一个单身人士 。
没有很多例子。日志文件是最重要的。您不想只放弃单个日志文件。您想要正确刷新,同步和关闭它。这是必须管理的单个共享资源的示例。
你很少需要一个单身人士。他们不好的原因是他们觉得自己是全球性的 ,他们是 GoF 设计模式书的全额付费会员。
当你认为自己需要全局时,你可能会犯一个可怕的设计错误。
一些编码的势利者瞧不起他们只是一个美化的全球。就像许多人讨厌goto声明一样,还有其他人讨厌使用全局的想法。我见过几个开发人员为了避免全球化而竭尽全力,因为他们考虑使用一个来承认失败。奇怪但真实。
在实践中, Singleton模式只是一种编程技术,是您的概念工具包的有用部分。您可能会不时发现它是理想的解决方案,因此请使用它。但是使用它只是为了让你夸耀使用设计模式就像拒绝使用它一样愚蠢,因为它只是一个全球性的 。