为啥单身人士被认为是一种不好的做法? [复制]

Posted

技术标签:

【中文标题】为啥单身人士被认为是一种不好的做法? [复制]【英文标题】:Why are singletons considered to be a bad practice? [duplicate]为什么单身人士被认为是一种不好的做法? [复制] 【发布时间】:2010-10-15 06:57:24 【问题描述】:

复制:

What is so bad about Singletons?

我正在阅读this 的问题,并且惊讶地发现(s)他认为单身人士被认为是“不好的做法”,实际上认为这是常识

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

那么...为什么它们不好?

【问题讨论】:

【参考方案1】:

它们不一定是坏的,只是被滥用和过度使用。人们似乎莫名其妙地被这种模式所吸引,并寻找新的和创造性的方法将其硬塞到他们的应用程序中,无论它是否真的适用。

【讨论】:

【参考方案2】:

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

Design Patterns 出现时,似乎每个人都加入了 Singleton 的潮流——他们无处不在,甚至是他们不应该出现的地方。你现在看到的是(也许是当之无愧的)强烈反对。并不是说您根本不应该使用它们,但退后一步看看所有可用的选项可能是个好主意。

【讨论】:

【参考方案3】:

单身人士一点也不坏。事实上,它们在许多情况下都非常有用。但他们确实有两个主要领域很容易被滥用和/或失败:

单元可测试性 多线程

两者都可以处理,但初学者经常忽略这样做(通常是由于无知),最终造成的麻烦比他们知道如何处理要多得多。

【讨论】:

【参考方案4】:

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

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

这就是人们通常说他们“坏”的原因。

此外,在多线程应用程序中,很多人对它们的实施很糟糕,以至于有可能多次调用实例化。

【讨论】:

这不是它们对多线程不利的唯一原因。如果做错了,它们可能会成为一个瓶颈,迫使对原本可以并行使用的资源进行序列化访问。 真的,谢谢你的指正。【参考方案5】:

它们不一定是坏的,只是它们往往被过度使用,并且在不需要时使用了很多。

【讨论】:

以上是关于为啥单身人士被认为是一种不好的做法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 exit() 被认为不好? [复制]

为啥从 main() 显式返回 0 被认为是好的做法? [复制]

使用动态是不是被认为是一种不好的做法?

一次导入一个类的所有子类是一种不好的做法吗? [复制]

用私有属性替换类中的每个字段是一种不好的做法吗? [复制]

为新类型实现 Deref 是不是被认为是一种不好的做法?