oop - 抽象工厂模式是否有“更多”真实世界的例子?
问题描述
我目前正在浏览 OPP 的设计模式。只是给你一些背景。这不是我第一次遇到这些模式。我已经编程了一段时间(十年左右)并且我非常熟悉许多编程原则,尤其是 SOLID。我主要从事 Web 应用程序开发,所以也许我遗漏了一些可以在不同编程领域学到的东西。
正如标题所暗示的,我正在努力更深入地掌握抽象工厂模式。我确实了解定义以及“何时使用模式”部分,但我仍然没有抓住重点。尤其是在将 SOLID 的开闭原理添加到方程中时。
我是什么意思?
上图取自 GOF 的设计模式书。
为了使这篇文章真正成为一个问题,有两件事我自己找不到答案:
当你学习开放封闭原则时,类应该保持封闭以进行修改。它导致的实现是近似于策略模式的东西。当您查看 AbstractFactory 的方法结构时,它会将它创建的所有产品列为单独的方法。这意味着当我们想向家族中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这不是违反开放封闭原则吗?也许没有更好的方法可以做到这一点,是吗?
其次,除了书中使用的示例(WidgetFactory - GOF,PizzaStore - HeadFirst)之外,任何人都可以为我提供一些真实世界的示例吗?您是否有任何常见的实现可以说“是的,这是我通常用抽象工厂实现的东西”?抽象工厂什么时候真正有用?或者我是否很好地理解了这种模式,但它在 Web 开发中并不常见?
我希望我能设法表达我对模式的不确定性。无论如何,请随时提出后续问题,我很乐意提供更多详细信息。
先感谢您!
担
解决方案
[OCP] 的实现结果类似于策略模式。
可能。有多种方法可以实现 OCP。Bertrand Meyer 在定义原则时最初吹捧继承。
...当我们想向家族中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这算不算违规...
可能。这取决于您如何实现该模式,但 GoF 书在第 90 页确实承认了这个问题。
支持新型产品是困难的。扩展抽象工厂以生产新型产品并不容易。这是因为 AbstractFactory 接口修复了可以创建的产品集。支持新型产品需要扩展工厂接口,这涉及更改 AbstractFactory 类及其所有子类。我们在实现部分讨论了这个问题的一种解决方案。
GoF 书中提到的解决方案是参数化 AbstractFactory 方法,这导致了它自己的一组问题。
...这在 Web 开发中并不常见?
不,这不对。在编写 GoF 书籍时,依赖注入并不是一种常见的模式,但今天它几乎取代了对抽象工厂的需求。今天我几乎愿意将抽象工厂称为反模式。但我仍然持开放态度,可能存在比 DI 更适合 AF 的问题。我只是还没有看到一个。
推荐阅读
- rust - 如何使用组合器(for_each 除外)在 Rust 中运行流以完成并且没有 while 循环?
- docker - Blazor WebAssembly 应用程序的运行 docker 映像问题
- python - 单击 QSystemTrayIcon 时有没有办法执行函数?
- botframework - 以编程方式将机器人添加到我的机器人列表中
- android - 在 Android 中的画布上绘制转换位图时性能缓慢
- flutter - 如何使用 Flutter 测试驱动程序从进度对话框中获取文本
- amazon-web-services - Codebuild 在 DOWNLOAD_SOURCE 阶段突然失败:SINGLE_BUILD_CONTAINER_DEAD
- c# - 从 VisualStudio 扩展添加解决方案项
- java - PDFBox 页面旋转 - 缩放的图像尺寸减小
- javascript - type=checkbox 的最终表单字段不适用于格式道具