【发布时间】:2021-03-18 07:45:12
【问题描述】:
假设我们要创建按钮和文本区域。
我们可以为 Windows 或 Mac 创建它们。
据我了解,有两种“switch”或“if”语句,一种用于选择所需的工厂,一种用于选择所需的产品。
但是如果我想添加“Linux”工厂和“文本字段”产品,我应该编辑代码并将第三个选项添加到“if”或“switch”语句中吗?
是不是违反了开闭原则?
【问题讨论】:
标签: design-patterns abstract-factory
假设我们要创建按钮和文本区域。
我们可以为 Windows 或 Mac 创建它们。
据我了解,有两种“switch”或“if”语句,一种用于选择所需的工厂,一种用于选择所需的产品。
但是如果我想添加“Linux”工厂和“文本字段”产品,我应该编辑代码并将第三个选项添加到“if”或“switch”语句中吗?
是不是违反了开闭原则?
【问题讨论】:
标签: design-patterns abstract-factory
抽象工厂中没有switch 或if 语句;但是,关于工厂模式存在大量错误信息,因此误解很常见。 What are the differences between Abstract Factory and Factory design patterns? 在这方面可能会有所帮助。
尽管如此,抽象工厂模式仍然容易违反 OCP,因为正如您所指出的,没有明显的方法可以添加新产品。 GoF 书确实解决了这个限制并提供了一个潜在的解决方案。见:Is there "more" real world example of Abstract Factory pattern?
【讨论】:
main 函数中使用这些 AF 实现。我使用switch 语句实现了AF,并在main 函数中以这种方式创建了一个按钮:Button uiElement =(Button)UiFactory.CreateUiFactory("Windows").CreateUiElement("Button"); 但现在我认为AF 只创建一个接口来指示其他工厂应该满足哪些要求,例如,所有UI工厂应该在我的示例中创建“按钮”和“文本区域”。我说的对吗?