可能重复:
What is so bad about Singletons?
我最近听说过Singleton是一种反模式。我知道它与事实有关,使得一个类单例就像使该唯一实例成为一个全局变量,但它也做了很多(限制该对象的实例数,管理实例化等等)。
为什么Singleton被认为是反模式?有哪些替代方案?
答案 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的内存。
随着对单例的过度使用,您将从面向对象的编程转变为过程编程。