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

Why is Singleton considered an anti-pattern?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is so bad about Singletons?

Singleton Design Pattern: Pitfalls

Singleton anti-pattern

我最近听说单打是反模式的。我知道这与使类成为singleton的事实有关,就像使该唯一实例成为全局变量一样,但它所做的也远不止这些(限制该对象的实例数量、管理实例化等)。

为什么辛格尔顿被认为是反模式?还有什么选择呢?


为了帮助回答问题,以下是关于反模式注释的更多信息:

it is overused, introduces unnecessary restrictions in situations
where a sole instance of a class is not actually required, and
introduces global state into an application

发件人:http://en.wikipedia.org/wiki/singleton_pattern

有关更多信息,请访问:https://www.michaelsafyan.com/tech/design/patterns/singleton

上面的博客有个很好的结局:

In short, the singleton pattern makes code more complex, less useful,
and a real pain to re-use or test. Eliminating singletons can be
tricky, but it’s a worthwhile endeavour.

好的,所以,这是一个反模式的原因在这一段中描述得很好,并且,正如作者所说,它将您的代码与单例紧密地结合在一起。

如果你发现你想使用单例,你可能会考虑你的设计,但有时它是有用的。

例如,有一次我必须编写一个应用程序,它最多可以有一个数据库连接,以处理数千个请求。所以,单例是有意义的,因为我的资源被限制为只有一个实例。

但是,一般来说,这用于简化代码,而不考虑将要引入的困难。

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

我认为挑战使用的最佳方法是考虑如果您的程序是多线程的,如何处理它,并且一个简单的方法是对它进行单元测试(如果您同时运行多个测试)。

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


我不认为辛格尔顿是反模式的。

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


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

我同意您的观点,单例可以作为一个全局唯一的实例。我从一些人那里了解到,作为单例的替代方法,我们可以使用静态变量和/或最终变量,也可以使用枚举(这样我们可以在一个组名下对多个变量进行分组,就像我们使用普通类/对象时通常做的那样)。

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

干杯。。。:)


单件工作通常执行得不好。参见双重检查锁定。

其中范围必须是唯一的单实例。像多线程环境、集群等。

单子可能很难测试。

无法释放分配给单一实例的内存。

由于使用了大量的单例程序,您将从面向对象编程转向过程编程。