单身人士有什么不好?

单身模式是GoF模式书的完全付费会员,但它最近似乎被开发者世界所遗弃。 我仍然使用了很多单身人士,特别是工厂类,并且虽然你必须小心多线程问题(实际上就像任何类),但我不明白他们为什么如此糟糕。

特别是堆栈溢出似乎认为每个人都认为单身人士是邪恶的。 为什么?

请以“事实,参考资料或具体专业知识”来支持您的答案


从Brian Button转述:

  • 它们通常用作全局实例,为什么这么糟糕? 因为你在代码中隐藏了应用程序的依赖关系,而不是通过接口公开它们。 让东西全球化以避免传递它是一种代码味道。

  • 他们违反单一责任原则:凭借他们控制自己的创作和生命周期的事实。

  • 它们固有地导致代码紧密耦合。 在很多情况下,这使得在测试中将它们伪装起来相当困难。

  • 它们在应用程序的整个生命周期内都会携带状态。 另一个打击测试,因为你可以结束与测试需要订​​购的情况下,这是一个很大的单元测试不是没有。 为什么? 因为每个单元测试应该独立于另一个。


  • 单身人士解决了一个(也是唯一的)问题。

    资源争夺。

    如果你有一些资源

    1 )只能有一个实例,并且

    2 )你需要管理那个单一的实例,

    你需要一个单身人士

    没有太多的例子。 日志文件是最大的一个。 你不想只放弃一个日志文件。 你想刷新,同步并正确关闭它。 这是必须管理的单个共享资源的示例。

    你很少需要一个单身人士。 他们糟糕的原因是他们觉得自己像一个全球性的人,而且他们是GoF Design Patterns书籍的完全付费会员。

    当你认为你需要一个全球性的,你可能会犯一个可怕的设计错误。


    一些编码势力将他们视为一个荣耀的全球。 就像很多人讨厌goto声明一样,还有一些人讨厌使用全球性的想法。 我看到有几位开发人员为了避免出现全球性而花费了大量时间,因为他们认为使用一个开发人员来承认失败。 奇怪而真实。

    在实践中,Singleton模式只是一种编程技术,它是您的工具包概念中有用的一部分。 有时您可能会发现它是理想的解决方案,因此请使用它。 但使用它只是因为你可以吹嘘使用设计模式就像拒绝使用它一样愚蠢,因为它只是一个全球性的。

    链接地址: http://www.djcxy.com/p/2319.html

    上一篇: What is so bad about singletons?

    下一篇: Which .NET Dependency Injection frameworks are worth looking into?