生成器模式和LSP

问题描述

我正在经历Builder模式,并且有几个我认为需要澄清的问题

  1. 是通过Abstract类或通过接口实现的构建器模式。很少有文章使用界面https://sourcemaking.com/design_patterns/builder
    https://refactoring.guru/design-patterns/builder
    ...可以列出更多的
    ,其他人则使用抽象类https://www.dofactory.com/net/builder-design-pattern

注意:我的想法是应该使用Abstract类来实现它。该基本原理基于这样的假设,即我可能会/可能不会在派生类中实现它们(因为可能有一些具体的类无法实现它们)...
不过,这种假设可能是完全错误的。

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

或者我完全误会了...

解决方法

评论太长了...

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

话虽如此,GoF构建器模式过于复杂。 The pattern is useful even without polymorphism.而且我认为这是最常实现的方式。如果您使用的是Java,那就是有效Java的Josh Bloch的Builder模式。

我并不是要忽略LSP问题,但如果此处的真正目标是学习有效使用Builder,那么我的建议是忽略GoF中的(过时)版本,并查看一个现代化的实现,这个问题不会出现。如果您真的想问有关LSP的问题,那么我建议一个专门针对该主题的新问题,与构建者模式分开。

要在OP中直接解决问题,

  1. 可以通过抽象类或接口来实现构建器模式。没关系。现代实现通常不使用它们。
  2. LSP的一致性将取决于您如何实现(和记录)模式。使用接口或抽象类可能违反(或不违反)LSP。消除两者消除了这个问题。