有人能告诉我为什么单身打破开/闭原则? 是因为从该类继承可能存在问题吗?
答案 0 :(得分:5)
要使课程成为"开放"必须有可能继承它。继承是一个" is-a"关系。如果从单例类继承,那么子类的实例也是父类的实例,因为" is-a"关系,意味着你可以突然拥有单例类的多个实例。
如果单身人士阶级禁止继承,则不再打开"打开"
如果单例类允许继承,并且"打开"对于扩展,它不再强制执行单例模式。
答案 1 :(得分:3)
一个常见的误解是Singleton设计模式禁止继承。完全不对。
摘自GoF书,第127页:
使用单例模式
- 必须完全是一个类的一个实例,并且必须可访问 来自知名访问点的客户端。
- 当唯一实例可以通过子类扩展,并且客户端 应该能够使用扩展实例而无需修改其代码。
...然后再次在第128页:
Singleton模式具有以下优点:
- 允许改进操作和表示形式。 Singleton类可以是 子类化,使用此实例配置应用程序很容易 扩展类。您可以使用以下实例配置应用程序: 运行时需要的课程。
第130页详细介绍了配置Singleton子类。
为什么Singleton打破OCP的答案是它没有,至少不是天生的。恰好最常见的是,未阅读GoF书的开发人员违反了OCP来实现它。工厂方法模式的命运几乎相同。
答案 2 :(得分:1)
Singleton模式存在两个问题: