不要在这个问题上浪费你的时间。跟进:单身人士有什么不好?
请随意在Singleton上抱怨。
单例使用不当可能会导致大量油漆。你在使用单例时遇到过什么样的问题?这种模式的常见误用是什么?
在深入研究 Corey 的回答后,我发现了一些关于这个主题的精彩文章。
不要在这个问题上浪费你的时间。跟进:单身人士有什么不好?
请随意在Singleton上抱怨。
单例使用不当可能会导致大量油漆。你在使用单例时遇到过什么样的问题?这种模式的常见误用是什么?
在深入研究 Corey 的回答后,我发现了一些关于这个主题的精彩文章。
单例模式本质上没有任何问题。它是一种工具,有时应该使用它。
有时它可以使您的代码更紧密地与从代码库的不同部分直接按名称引用的单例类耦合。因此,例如,当您需要测试代码的某些部分并且它从代码的不同部分引用单例时,您不能轻易地用模拟对象伪造该依赖项。
我没有像其他一些海报那样接触过 Singleton,但我见过的几乎所有实现(在 C# 中)都可以通过静态类/方法实现。我想您可能会争辩说静态类是单例模式的实现,但这不是我所看到的。当人们真正需要的是使用 static 关键字时,我一直看到人们构建和管理这些 Singleton 类/对象。
所以,我不会说单例模式不好。我会说这有点像枪。我不认为枪支不好,但它们肯定会被不当使用。
我认为一个更合适的问题可能是:在什么情况下使用单例模式不合适?或者你看到了什么使用了不应该使用的单例。
单例本身并没有什么问题,作为一种模式,它在认识到某些对象只需要一次创建的需要方面起着至关重要的作用。
它经常被用来委婉地使用全局变量,试图绕过全局变量的污名,而这种用法本质上是错误的。如果全局变量恰好是正确的解决方案,则使用单例不会改善它。如果使用全局变量是不正确的(这是相当普遍的),那么将它包装在一个单例中不会使其更正确。
基本上单例是一种拥有静态数据并假装它不是真正静态的方法。
我当然使用它,但尽量不要滥用它。
原始 GoF 设计的一个基本问题是析构函数没有受到保护。任何引用单例实例的人都可以自由地销毁单例。
请参阅 John Vlissides 在他的书“模式孵化”(亚马逊链接)中更新“杀死一个单身人士” 。
干杯,
抢
我看到的大多数单例模式都不是以线程安全的方式编写的。如果写得正确,它们会很有用。