建造者模式和 LSP

Builder Pattern and LSP

我正在研究构建器模式,有几个问题我认为需要澄清

  1. 构建器模式是通过抽象class还是通过接口实现的。很少有帖子使用接口 https://sourcemaking.com/design_patterns/builder
    https://refactoring.guru/design-patterns/builder
    ...can list more
    and others uses abstract class https://www.dofactory.com/net/builder-design-pattern

注:我认为的方式是应该使用Abstract来实现class。这个理由是基于这样的假设,即我 may/may 不会在派生 class 中实现它们(因为有可能一些具体的 class 不会实现它们)...
不过,这个假设可能是完全错误的。

  1. 如果上述假设是错误的,那么它不会违反LSP。由于 LSP 中的一个条件说您不能在派生的 class.
  2. 中有“未实现的方法”

或者我完全误解了...

评论太长了...

GoF 书中的模式早于 Java。正是 Java 后来引入了接口和抽象之间的(愚蠢的)区别 class。当 GoF 提到接口时,它们只是表示抽象,您可以使用任何支持抽象的语言特性来实现它。

也就是说,GoF Builder Pattern 过于复杂了。 The pattern is useful even without polymorphism. 我认为这是最常实施的方式。如果您使用的是 Java,那将是来自 Effective Java.

的 Josh Bloch 的构建器模式

我并不是要驳回 LSP 问题,但如果这里的真正目标是学习有效地使用 Builder,那么我的建议是忽略 GoF 的(过时的)版本并查看现代的在没有出现该问题的情况下实施。如果您真的想问关于 LSP 的问题,那么我建议提出一个专门针对该主题的新问题,与构建器模式分开。

为了更直接地解决 OP 中的问题,

  1. 建造者模式可以通过抽象classes或者通过接口来实现。哪个都没关系。现代实现更经常使用两者。
  2. LSP 一致性将取决于您如何实现(和记录)模式。使用接口或抽象 classes 有可能违反(或不违反)LSP。消除两者就消除了这个问题。