我已经阅读了Stack Overflow问题的几个答案,其中使用单身人士是沮丧和邪恶的。那是为什么?
答案 0 :(得分:6)
实例化类的次数不应由类本身决定,而应由提供单个实例的基础结构决定。 Singleton使得无法将此决定留给基础设施。这是一个可重用性问题,例如在单元测试中显示,但也在基础结构试图为特定目的提供另一个实例时。
(例如,只有一个数据库连接。但是为了从另一个数据库导入数据,它需要另一个连接。如果数据库访问服务是单例,则无法打开另一个连接。)
答案 1 :(得分:2)
Singleton模式使单元测试变得更加困难,因为它将全局状态引入应用程序。
还应该注意,这种模式降低了程序内并行性的可能性,因为必须序列化对多线程上下文中单例的访问,例如通过锁定。
依赖注入的倡导者会将此视为反模式,主要是因为它使用了私有和静态方法。
有些人建议使用诸如Java或PHP等语言中的反射等方法来分解单例模式。
答案 2 :(得分:0)
简短的回答是,他们在您的代码中引入了一个全局状态对象,这会破坏您关注点的分离(可能会增加复杂性)。
单身人士并非没有其他缺点,你应该知道:
http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks
这篇文章有点冗长:
http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial
答案 3 :(得分:0)
原因可能是他们基本上是global variables。即便如此,它们在某些环境中也被广泛使用。例如,在长时间运行的Web服务中。例如,在Java中Spring Framework,默认的bean类型是单例,通常控制器,服务和DAO对象是单例(在某种意义上,框架只实例化一个实例) )。它们不需要锁定并且也是线程安全的,因为按照惯例,它们不包含任何状态。通常传入请求上下文,并且控制器/服务/ DAO对其进行操作。