关于不可知的语言:单例有什么问题?

关于不可知的语言:单例有什么问题?

What's wrong with singleton?

不要在这个问题上浪费时间。 跟进:单身人士有什么不好?

请随意在Singleton上bit子。

Singleton使用不当可能会引起大量油漆。 您在单例中遇到了什么问题? 这种模式的常见误用是什么?

在深入研究Corey的答案之后,我发现了一些有关该主题的精彩文章。

  • 为什么单身人士有争议
  • 表演者单身人士
  • 单身人士是病态的骗子
  • 所有的单身人士都去了哪里?
  • 单身人士的根本原因

看到这个线程


有时,它可以使您的代码更紧密地结合在一起,而单例类则通过名称直接从代码库的不同部分进行引用。因此,例如,当您需要测试代码的某些部分并且它从代码的不同部分引用了一个单例时,您就无法轻松地通过模拟对象伪造该依赖关系。


Singleton模式本质上没有错。它是一种工具,有时应使用。


我没有像其他海报那样接触过Singleton,但是我看到的(在C#中)几乎所有实现都可以通过静态类/方法来实现。我想您可能会认为静态类是单例模式的实现,但这不是我所看到的。我一直看到人们在真正需要的只是使用static关键字时建立并管理这些Singleton类/对象。

因此,我不会说Singleton模式不好。我会说这有点像枪支。我认为枪支并不坏,但可以肯定可以适当地使用它们。


本身没有任何问题,并且作为一种模式,它在认识到某些对象只能创建一次的必要性中起着至关重要的作用。

它经常用于委婉表达全局变量,以避开全局变量的污名,而这种用法天生就是错误的。如果全局变量恰好是正确的解决方案,则使用单例将无法改善它。如果使用全局变量不正确(很常见),则将其包装为单例将不会使其更正确。


原始GoF设计的一个基本问题是,析构函数不受保护。任何引用单例实例的人都可以随意销毁单例。

请参阅John Vlissides在他的书" Pattern Hatching"中更新的" To Kill Singleton"(亚马逊链接)。

干杯,


基本上,单例是拥有静态数据并假装它不是真正静态的方法。

我当然会使用它,但请尽量不要滥用它。


我认为可能更合适的问题是:在什么情况下使用SIngleton模式不合适?或者您看到了哪些使用不应该使用的Singleton。


我看到的大多数单例模式不是以线程安全的方式编写的。如果书写正确,它们会很有用。


推荐阅读