抽象工厂设计模式是不是违反打开/关闭原则?
Posted
技术标签:
【中文标题】抽象工厂设计模式是不是违反打开/关闭原则?【英文标题】:Does Abstract factory design pattern violate open/close principle?抽象工厂设计模式是否违反打开/关闭原则? 【发布时间】:2021-03-18 07:45:12 【问题描述】:假设我们要创建按钮和文本区域。
我们可以为 Windows 或 Mac 创建它们。
据我了解,有两种“switch”或“if”语句,一种用于选择所需的工厂,一种用于选择所需的产品。
但是如果我想添加“Linux”工厂和“文本字段”产品,我应该编辑代码并将第三个选项添加到“if”或“switch”语句中吗?
是不是违反了开闭原则?
【问题讨论】:
【参考方案1】:抽象工厂中没有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工厂应该在我的示例中创建“按钮”和“文本区域”。我说的对吗?
在那种情况下,我会说你(和其他人)实现的不是抽象工厂模式;而对于“这不是违反开/关原则吗?”这个问题的答案很简单,是的。该模式的最佳描述和示例在上面的第一个链接线程中。你说得对,它是一个定义相关产品的接口。以上是关于抽象工厂设计模式是不是违反打开/关闭原则?的主要内容,如果未能解决你的问题,请参考以下文章