抽象工厂设计模式是不是违反打开/关闭原则?

Posted

技术标签:

【中文标题】抽象工厂设计模式是不是违反打开/关闭原则?【英文标题】:Does Abstract factory design pattern violate open/close principle?抽象工厂设计模式是否违反打开/关闭原则? 【发布时间】:2021-03-18 07:45:12 【问题描述】:

假设我们要创建按钮和文本区域。

我们可以为 Windows 或 Mac 创建它们。

据我了解,有两种“switch”或“if”语句,一种用于选择所需的工厂,一种用于选择所需的产品。

但是如果我想添加“Linux”工厂和“文本字段”产品,我应该编辑代码并将第三个选项添加到“if”或“switch”语句中吗?

是不是违反了开闭原则?

【问题讨论】:

【参考方案1】:

抽象工厂中没有switchif 语句;但是,关于工厂模式存在大量错误信息,因此误解很常见。 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工厂应该在我的示例中创建“按钮”和“文本区域”。我说的对吗? 在那种情况下,我会说你(和其他人)实现的不是抽象工厂模式;而对于“这不是违反开/关原则吗?”这个问题的答案很简单,是的。该模式的最佳描述和示例在上面的第一个链接线程中。你说得对,它是一个定义相关产品的接口。

以上是关于抽象工厂设计模式是不是违反打开/关闭原则?的主要内容,如果未能解决你的问题,请参考以下文章

设计模式二:工厂模式

设计模式抽象工厂模式

设计模式:工厂方法模式

设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)

设计原则工厂模式抽象工厂模式策略模式

设计模式-创建模式