为什么单身人士违反开放/封闭原则?

时间:2016-04-27 10:35:01

标签: design-patterns singleton solid-principles

有人能告诉我为什么单身打破开/闭原则? 是因为从该类继承可能存在问题吗?

3 个答案:

答案 0 :(得分:5)

要使课程成为"开放"必须有可能继承它。继承是一个" is-a"关系。如果从单例类继承,那么子类的实例也是父类的实例,因为" is-a"关系,意味着你可以突然拥有单例类的多个实例。

如果单身人士阶级禁止继承,则不再打开"打开"

如果单例类允许继承,并且"打开"对于扩展,它不再强制执行单例模式。

答案 1 :(得分:3)

一个常见的误解是Singleton设计模式禁止继承。完全不对。

摘自GoF书,第127页:

使用单例模式

  • 必须完全是一个类的一个实例,并且必须可访问 来自知名访问点的客户端。
  • 当唯一实例可以通过子类扩展,并且客户端 应该能够使用扩展实例而无需修改其代码。

...然后再次在第128页:

Singleton模式具有以下优点:

  1. 允许改进操作和表示形式。 Singleton类可以是 子类化,使用此实例配置应用程序很容易 扩展类。您可以使用以下实例配置应用程序: 运行时需要的课程。

第130页详细介绍了配置Singleton子类。

为什么Singleton打破OCP的答案是它没有,至少不是天生的。恰好最常见的是,未阅读GoF书的开发人员违反了OCP来实现它。工厂方法模式的命运几乎相同。

答案 2 :(得分:1)

Singleton模式存在两个问题:

  • 它打破了开放/封闭原则,因为单例类本身可以控制其实例的创建,而其他类则依赖于它。这样就不允许另一个实现更改实现,而无需在整个应用程序中进行彻底的更改。
  • 它打破了依赖倒置原则,因为消费者总是直接依赖于具体类来获取实例,而DIP则说我们应该依赖于抽象。这会导致单例实现被拖拽,并且不允许通过将实现包装在装饰器中或在没有单例实现的情况下分发客户端来添加横切关注点。