单例模式是GoF模式书中一个完全付费的成员,但最近它似乎被开发人员世界孤立了。我仍然使用了相当多的单线程,特别是对于工厂类,虽然你必须对多线程问题(像任何类一样)小心一点,但我不明白为什么它们如此糟糕。
Stack Overflow似乎特别假设每个人都认为Singleton是邪恶的。为什么?
请用“事实、参考资料或具体专业知识”来支持您的回答
单例模式是GoF模式书中一个完全付费的成员,但最近它似乎被开发人员世界孤立了。我仍然使用了相当多的单线程,特别是对于工厂类,虽然你必须对多线程问题(像任何类一样)小心一点,但我不明白为什么它们如此糟糕。
Stack Overflow似乎特别假设每个人都认为Singleton是邪恶的。为什么?
请用“事实、参考资料或具体专业知识”来支持您的回答
当前回答
单线图的一个相当糟糕的地方是,你不能很容易地扩展它们。如果你想改变他们的行为,你基本上必须构建某种装饰模式或类似的东西。此外,如果有一天你想用多种方式来做这一件事,那么改变可能会很痛苦,这取决于你如何布局代码。
需要注意的一点是,如果您确实使用了单体,请尝试将它们传递给需要它们的人,而不是让他们直接访问。。。否则,如果您选择使用多种方式来完成单例所做的事情,那么如果每个类都直接访问单例,那么很难进行更改,因为每个类都嵌入了一个依赖项。
所以基本上:
public MyConstructor(Singleton singleton) {
this.singleton = singleton;
}
而不是:
public MyConstructor() {
this.singleton = Singleton.getInstance();
}
我认为这种模式被称为依赖注入,通常被认为是一件好事。
就像任何模式一样。。。思考它,并考虑它在给定情况下的使用是否不合适。。。规则通常是被打破的,模式不应该随意应用。
其他回答
从纯粹主义的观点来看,单身汉是不好的。
从实践的角度来看,单例是开发时间与复杂性的权衡。
如果你知道你的应用程序不会有太大的变化,那么它们很好用。只要知道,如果您的需求以意外的方式发生变化(在大多数情况下这是很正常的),您可能需要重构。
单体有时也会使单元测试复杂化。
假设该模式用于模型的某个方面,而该方面是真正的单一模式,则该模式没有本质上的错误。
我认为这种反弹是由于它的过度使用,而这反过来又是因为它是最容易理解和实施的模式。
它很容易(ab)用作全局变量。依赖于单态的类相对来说更难单独进行单元测试。
我认为这种混乱是因为人们不知道Singleton模式的真正应用。我再怎么强调也不为过。Singleton不是包装全局变量的模式。Singleton模式只应用于确保在运行时存在给定类的一个且只有一个实例。
人们认为辛格尔顿是邪恶的,因为他们在全球范围内使用它。正是因为这种困惑,辛格尔顿被人看不起。请不要混淆Singleton和globals。如果用于预期用途,您将从Singleton模式中获得极大的好处。
单例使用静态方法实现。静态方法是做单元测试的人所避免的,因为它们不能被嘲笑或拒绝。这个网站上的大多数人都是单元测试的支持者。避免这种情况的最普遍接受的惯例是使用控制模式反转。