首页 > 解决方案 > 抽象工厂模式是否有“更多”真实世界的例子?

问题描述

我目前正在浏览 OPP 的设计模式。只是给你一些背景。这不是我第一次遇到这些模式。我已经编程了一段时间(十年左右)并且我非常熟悉许多编程原则,尤其是 SOLID。我主要从事 Web 应用程序开发,所以也许我遗漏了一些可以在不同编程领域学到的东西。

正如标题所暗示的,我正在努力更深入地掌握抽象工厂模式。我确实了解定义以及“何时使用模式”部分,但我仍然没有抓住重点。尤其是在将 SOLID 的开闭原理添加到方程中时。

我是什么意思?

在此处输入图像描述

上图取自 GOF 的设计模式书。

为了使这篇文章真正成为一个问题,有两件事我自己找不到答案:

  1. 当你学习开放封闭原则时,类应该保持封闭以进行修改。它导致的实现是近似于策略模式的东西。当您查看 AbstractFactory 的方法结构时,它会将它创建的所有产品列为单独的方法。这意味着当我们想向家族中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这不是违反开放封闭原则吗?也许没有更好的方法可以做到这一点,是吗?

  2. 其次,除了书中使用的示例(WidgetFactory - GOF,PizzaStore - HeadFirst)之外,任何人都可以为我提供一些真实世界的示例吗?您是否有任何常见的实现可以说“是的,这是我通常用抽象工厂实现的东西”?抽象工厂什么时候真正有用?或者我是否很好地理解了这种模式,但它在 Web 开发中并不常见?

我希望我能设法表达我对模式的不确定性。无论如何,请随时提出后续问题,我很乐意提供更多详细信息。

先感谢您!

标签: oopdesign-patternsabstract-factoryopen-closed-principle

解决方案


[OCP] 的实现结果类似于策略模式。

可能。有多种方法可以实现 OCP。Bertrand Meyer 在定义原则时最初吹捧继承。

...当我们想向家族中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这算不算违规...

可能。这取决于您如何实现该模式,但 GoF 书在第 90 页确实承认了这个问题。

支持新型产品是困难的。扩展抽象工厂以生产新型产品并不容易。这是因为 AbstractFactory 接口修复了可以创建的产品集。支持新型产品需要扩展工厂接口,这涉及更改 AbstractFactory 类及其所有子类。我们在实现部分讨论了这个问题的一种解决方案。

GoF 书中提到的解决方案是参数化 AbstractFactory 方法,这导致了它自己的一组问题。

...这在 Web 开发中并不常见?

不,这不对。在编写 GoF 书籍时,依赖注入并不是一种常见的模式,但今天它几乎取代了对抽象工厂的需求。今天我几乎愿意将抽象工厂称为反模式。但我仍然持开放态度,可能存在比 DI 更适合 AF 的问题。我只是还没有看到一个。


推荐阅读