以下是作者的一些反驳观点:
如果将来需要使类不再是单例,您将陷入困境 完全不是这样 - 我曾经遇到过一个单个数据库连接单例的情况,我想将其转换为连接池。 请记住,每个单例都通过标准方法访问:
MyClass.instance
这类似于工厂方法的签名。我所做的就是更新instance方法以从池中返回下一个连接 - 不需要进行任何其他更改。如果我们没有使用单例,那将会更加困难。
单例只是花哨的全局变量 无法否认,但所有静态字段和方法也都是如此 - 任何从类而不是实例访问的内容本质上都是全局的,而我并没有看到对使用静态字段的反弹如此之大?
不是说单例很好,只是在这里反驳一些“传统智慧”的观点。
getInstance()
时,它会给我一个不同的实例,但我仍然没有办法只说“我有一个实例。现在我需要另一个实例来完成另一个任务”。在第二点上,许多东西只是花哨的全局变量,但单例模式将这与许多不必要的负担(1个实例限制、复杂且容易出错的同步问题)耦合在一起。 - jalfstatic
只是C#/Java中“全局”的拼写方式。至于静态函数,如果没有静态变量,它们就不太成问题了;全局性最大的问题是“远程操作”和它带来的隐藏依赖关系,而一个没有互调存储空间(没有实例,也没有可变的静态变量)的函数最终会受到很大限制,无法依赖于什么(以及它可以搞乱什么)。 - cHao马克·拉德福德(Mark Radford)在《Overload Journal #57 – Oct 2003》中撰写的文章“单例模式-反模式!”详细阐述了为什么单例模式被认为是一种反模式。该文章还讨论了两种替代设计方法来取代单例模式。
我可以举几个例子: