关于C#:为什么单件Singletons被认为是一个坏习惯?

Why are singletons considered to be a bad practice?

本问题已经有最佳答案,请猛点这里访问。

复制品:

What is so bad about Singletons?

我在读这个问题,惊讶地发现他认为独生子女是一种"坏习惯",事实上,我认为这是常识。

在任何使用iBATIS从XML加载查询的项目中,我都使用过单例。在这些情况下,它极大地提高了速度。我不知道你为什么不在这种情况下使用它们。

所以…为什么是坏的?


它们是一种工具,就像任何工具一样,有时你应该使用它们,有时你应该使用其他东西。在这种情况下,通常情况下,其他的东西(工厂类、静态类)在乍一看似乎适合单例情况下会更好。

Design Patterns出来的时候,似乎每个人都跳上了独角车,他们无处不在,甚至不应该出现的地方。你现在看到的是(也许是应得的)反弹。并不是说你根本不应该使用它们,但最好退后一步,看看所有可用的选项。


他们不一定是坏的,只是误用和过度使用。人们似乎莫名其妙地被这种模式所吸引,并寻找新的、有创意的方法将其应用到他们的应用中,不管它是否真正适用。


单身一点也不坏。事实上,它们在许多情况下都非常有用。但是,它们有两个主要方面已经成熟,可以被滥用和/或失败:

  • 单元可测试性
  • 多线程

两者都可以处理,但初学者往往忽略了这一点(通常是由于无知),最终导致的麻烦远超过他们所知道的处理方法。


它们通常与单元测试一起被认为是坏的。

如果您有一个单例,这意味着您的一个或多个类在某些方法的某个地方使用它。这是一个依赖项,当单元测试您的类时,您不能欺骗它,因为该类在没有通过其构造函数或属性请求的情况下直接使用它。

这就是为什么人们说他们"坏"的原因。

而且,在多线程应用程序中,很多人都很糟糕地实现了它们,以至于有机会多次调用声明。


它们并不一定是坏的,因为它们往往被过度使用,并且在不需要的时候被大量使用。