如何解决生成器模式和LSP
我正在经历Builder模式,并且有几个我认为需要澄清的问题
- 是通过Abstract类或通过接口实现的构建器模式。很少有文章使用界面https://sourcemaking.com/design_patterns/builder
https://refactoring.guru/design-patterns/builder
...可以列出更多的
,其他人则使用抽象类https://www.dofactory.com/net/builder-design-pattern
注意:我的想法是应该使用Abstract类来实现它。该基本原理基于这样的假设,即我可能会/可能不会在派生类中实现它们(因为可能有一些具体的类无法实现它们)...
不过,这种假设可能是完全错误的。
- 如果以上假设是错误的,则不会违反LSP。由于LSP中的一个条件说您在派生类中不能有“未实现的方法”。
或者我完全误会了...
解决方法
评论太长了...
GoF书中的模式早于Java。后来,Java引入了接口和抽象类之间的(愚蠢的)区别。当GoF引用接口时,它们仅表示抽象,您可以使用支持抽象的任何语言功能来实现它。
话虽如此,GoF构建器模式过于复杂。 The pattern is useful even without polymorphism.而且我认为这是最常实现的方式。如果您使用的是Java,那就是有效Java的Josh Bloch的Builder模式。
我并不是要忽略LSP问题,但如果此处的真正目标是学习有效使用Builder,那么我的建议是忽略GoF中的(过时)版本,并查看一个现代化的实现,这个问题不会出现。如果您真的想问有关LSP的问题,那么我建议一个专门针对该主题的新问题,与构建者模式分开。
要在OP中直接解决问题,
- 可以通过抽象类或接口来实现构建器模式。没关系。现代实现通常不使用它们。
- LSP的一致性将取决于您如何实现(和记录)模式。使用接口或抽象类可能违反(或不违反)LSP。消除两者消除了这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。