单例是设计模式还是反模式? [已关闭]

问题描述 投票:0回答:1

单例是设计模式还是反模式?

design-patterns singleton anti-patterns
1个回答
8
投票

据我所知,Brown 等人于 1998 年出版的《AntiPatterns》一书可能是第一本普及该术语的书。它定义了这样的反模式:

“反模式是一种文学形式,它描述了对产生明显负面后果的问题的常见解决方案。”

我认为值得关注“绝对负面后果”这句话。大多数解决方案都有一些缺点,但为了使“解决方案”成为反模式,缺点必须明显超过所产生的任何优点。

我通常会以另一种方式看待它。如果我可以用不同的方式解决问题,至少产生同样多的优点,但缺点更少,那么第一个“解决方案”可能是反模式。

正如 GoF 书中所述,单例设计模式解决了一个特定问题:有时您希望确保一个类只能存在一个实例。 出于性能原因,这可能是合适的。如果对象保存大量数据,确保仅存在一个可以提高性能。

即使该对象不持有大量内存,如果您希望客户端代码可能实例化数百万个相同的对象,您也可能希望将一个小的不可变对象设置为单例。

特别是当 Singleton 对象表示不可变数据时,很难说它会产生明显的负面后果。它基本上只是一个常数,如

string.Empty

。 Singleton 模式很好地解决了此类问题。

另一方面,许多人使用

可变
单例作为依赖注入或部分函数应用等技术的替代品。当以这种方式使用时,单例就变成了

全局变量

,现在大多数人都认为应该避免这种情况。 既然 Singleton 有有效的用途,我认为它不能被称为反模式。另一方面,我认为 mutable Singleton 是一种接近反模式的代码味道。

© www.soinside.com 2019 - 2024. All rights reserved.