为什么Singleton被认为是反模式?

时间:2012-10-06 00:07:18

标签: design-patterns anti-patterns

  

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

     

Singleton Design Pattern: Pitfalls

     

Singleton anti-pattern

我最近听说过Singleton是一种反模式。我知道它与事实有关,使得一个类单例就像使该唯一实例成为一个全局变量,但它也做了很多(限制该对象的实例数,管理实例化等等)。

为什么Singleton被认为是反模式?有哪些替代方案?

4 个答案:

答案 0 :(得分:61)

为了帮助回答,这里有更多关于反模式评论的内容:

  

它被过度使用,在情况下引入了不必要的限制   实际上并不需要类的唯一实例,以及   将全局状态引入应用程序

来自:http://en.wikipedia.org/wiki/Singleton_pattern

有关详情,请查看:https://www.michaelsafyan.com/tech/design/patterns/singleton

以上是上述博客的一个很好的结局:

  

简而言之,单例模式使代码更复杂,更有用,   以及重复使用或测试的真正痛苦。消除单身人士可以   棘手,但这是值得的努力。

好的,所以,这个反模式的原因在本段中有很好的描述,正如作者所表达的那样,它将你的代码紧密地耦合到单身。

如果您发现要使用单件,您可能需要考虑您的设计,但有时它会有用。

例如,一旦我必须编写一个最多只能有一个数据库连接的应用程序,就可以处理数千个请求。因此,单身人士是有道理的,因为我资源只限于只有一个实例。

但是,通常这用于简化代码,而不考虑将要引入的困难。

例如,这也适用于静态类,如果单元测试或具有并发性,那么一个请求的状态将改变状态并且可能导致问题,因为调用实例的类可能假定为状态正如预期的那样。

我认为挑战使用的最好方法是考虑如果你的程序是多线程的,如何处理它,一个简单的方法是对它进行单元测试,如果你有几个测试运行在一个时间。

如果您发现仍然需要它,那么请使用它,但要意识到以后会遇到的问题。

答案 1 :(得分:19)

我不认为单身是一种反模式。

但是,单例基本上是一种使用全局变量的方法。全局变量很糟糕,因为系统中任何地方的任何代码都可以改变它们的值。因此,在调试时,很难确定哪个代码路径会导致单例的当前状态。

答案 2 :(得分:10)

我认为它被认为是一种反模式,因为Singleton类不能被其他对象以正常方式实例化(除非通过调用通常名为“getInstance”的方法)。因此,看起来直接使用该类而不实例化它以首先创建可用对象。

我同意您的看法,Singleton可以作为全球唯一的实例。我从一些人那里了解到,作为Singleton的替代品,我们可以使用静态和/或最终变量,我们也可以使用枚举(这样我们就可以将多个变量组合在一个组名下,就像我们在使用普通类/对象)。

但是,这些替代方案只能匹配Singleton类在存储状态/值时的能力。如果我们需要使用独特的函数,那些静态/最终变量和枚举就无济于事。在我看来,当我们需要使用Singleton类时(当我们需要一些独特的函数来处理静态/最终状态/值时)就是这种情况。

干杯...... :))

答案 3 :(得分:6)

单身人士经常被严重执行。请参阅双重检查锁定。

Singleton实例必须在哪个范围内是唯一的。像多线程环境,聚类等。

单身人士很难测试。

无法释放分配给Singleton的内存。

随着对单例的过度使用,您将从面向对象的编程转变为过程编程。