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

时间:2011-08-09 14:12:54

标签: design-patterns

  

可能重复:
  What is so bad about singletons?

我已经阅读了Stack Overflow问题的几个答案,其中使用单身人士是沮丧和邪恶的。那是为什么?

4 个答案:

答案 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服务中。例如,在JavaSpring Framework,默认的bean类型是单例,通常控制器,服务和DAO对象是单例(在某种意义上,框架只实例化一个实例) )。它们不需要锁定并且也是线程安全的,因为按照惯例,它们不包含任何状态。通常传入请求上下文,并且控制器/服务/ DAO对其进行操作。