为什么不鼓励使用单例模式?

可能重复:
单身人士有什么不好?

我已经阅读了堆栈溢出问题的几个答案,使用单例是令人沮丧和邪恶的。 这是为什么?


一个类实例化多少次不应该由类本身决定,而应该由提供单实例的基础结构决定。 Singleton使得这个决定不可能离开基础设施。 这是一个可重用性问题,例如在单元测试中出现,而且当基础架构试图为特定目的提供另一个实例时。

(例如,只有一个数据库连接,但是为了从另一个数据库导入数据,它需要另一个连接,如果数据库访问服务是单身,那么打开另一个连接是不可能的。)


单例模式使得单元测试更加困难,因为它将全局状态引入到应用程序中。

还应该注意的是,这种模式降低了程序内并行的可能性,因为在多线程环境中对单例的访问必须被序列化,例如通过锁定。

倡导依赖注入的人会认为这是一种反模式,主要是由于它使用私有和静态方法。

有人提出了使用诸如Java或PHP之类的语言反射的方法来打破单例模式的方法。


简短的回答是,他们将全局状态对象引入代码中,这会打破您对问题的分离(可能会增加复杂性)。

单身人士不是没有其他的缺点,你应该知道:

http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks

这篇文章有点冗长:

http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial

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

上一篇: Why is using the singleton pattern discouraged?

下一篇: Are there any viable alternatives to the GOF Singleton Pattern?