单例模式是GoF模式书中一个完全付费的成员,但最近它似乎被开发人员世界孤立了。我仍然使用了相当多的单线程,特别是对于工厂类,虽然你必须对多线程问题(像任何类一样)小心一点,但我不明白为什么它们如此糟糕。

Stack Overflow似乎特别假设每个人都认为Singleton是邪恶的。为什么?

请用“事实、参考资料或具体专业知识”来支持您的回答


当前回答

单身者解决了一个(而且只有一个)问题。

资源争夺。

如果你有一些资源

(1) 只能有一个实例,并且

(2) 您需要管理单个实例,

你需要一个单身汉。

例子不多。日志文件是最大的文件。您不想只放弃一个日志文件。您希望正确刷新、同步和关闭它。这是必须管理的单个共享资源的示例。

你很少需要单身汉。他们之所以不好,是因为他们觉得自己是一个全球性的人,而且他们是GoF设计模式书的全额付费成员。

当你认为你需要一个全局,你可能犯了一个可怕的设计错误。

其他回答

单身汉——反模式!马克·拉德福德(Mark Radford)的《过载杂志》(Overload Journal#57–2003年10月)很好地解释了为什么辛格尔顿被视为反模式。本文还讨论了替代Singleton的两种替代设计方法。

因为它们基本上是面向对象的全局变量,所以通常可以用这样的方式设计类,这样就不需要它们了。

单线图的一个相当糟糕的地方是,你不能很容易地扩展它们。如果你想改变他们的行为,你基本上必须构建某种装饰模式或类似的东西。此外,如果有一天你想用多种方式来做这一件事,那么改变可能会很痛苦,这取决于你如何布局代码。

需要注意的一点是,如果您确实使用了单体,请尝试将它们传递给需要它们的人,而不是让他们直接访问。。。否则,如果您选择使用多种方式来完成单例所做的事情,那么如果每个类都直接访问单例,那么很难进行更改,因为每个类都嵌入了一个依赖项。

所以基本上:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

而不是:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

我认为这种模式被称为依赖注入,通常被认为是一件好事。

就像任何模式一样。。。思考它,并考虑它在给定情况下的使用是否不合适。。。规则通常是被打破的,模式不应该随意应用。

从纯粹主义的观点来看,单身汉是不好的。

从实践的角度来看,单例是开发时间与复杂性的权衡。

如果你知道你的应用程序不会有太大的变化,那么它们很好用。只要知道,如果您的需求以意外的方式发生变化(在大多数情况下这是很正常的),您可能需要重构。

单体有时也会使单元测试复杂化。

单身汉还不错。只有当你做了一些全球独一无二的东西而不是全球独一无二的时候,才是糟糕的。

然而,有“应用程序范围服务”(想想让组件交互的消息传递系统)-这是一个单例调用,一个“MessageQueue”-类,它有一个方法“SendMessage(…)”。

然后,您可以在各地执行以下操作:

MessageQueue.Current.SendMessage(新邮件到达消息(…));

当然,还要做到:

MessageQueue.Current.RegisterReceiver(this);

在实现IMessageReceiver的类中。