我目前正在研究OPP的设计模式。只是为了给您一些背景知识。这不是我第一次遇到这些模式。我已经编程了一段时间(十年左右),并且非常熟悉许多编程原理,尤其是 SOLID。我主要从事网络应用程序开发,所以也许我错过了一些可以在不同编程领域学到的东西。
正如标题所示,我正在努力深入掌握抽象工厂模式。我确实理解定义以及“何时使用模式”部分,但我仍然没有抓住重点。特别是当将 SOLID 的开闭原理添加到方程中时。
我是什么意思?
上图取自 GOF 的《设计模式》一书。
为了使这篇文章真正成为一个问题,有两件事我自己找不到答案:
当你学习开放封闭原则时,你会发现类应该保持封闭状态以进行修改。它导致的实现类似于策略模式。当您查看 AbstractFactory 的方法结构时,它会列出它创建的所有产品作为单独的方法。这意味着当我们想要向系列中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这不是违反了开闭原则吗?也许没有更好的方法来做到这一点,不是吗?
其次,除了书中使用的例子(WidgetFactory - GOF,PizzaStore - HeadFirst)之外,任何人都可以为我提供一些现实世界的例子吗?您是否有任何常见的实现可以让您说“是的,这是我通常使用抽象工厂实现的东西”?抽象工厂什么时候真正有用?或者我是否很好地理解了该模式,但它在 Web 开发中并不常见?
我希望我能以某种方式表达我对这种模式的不确定性。无论如何,请随时提出后续问题,我很乐意提供更多详细信息。
先感谢您!
Dan
[OCP] 的实现结果类似于策略模式。
可能吧。有多种方法可以实现 OCP。伯特兰·迈耶(Bertrand Meyer)最初在定义这一原则时大力宣扬继承。
...当我们想要向系列中添加新产品时,我们需要修改抽象工厂并创建新方法。这不是违规吗...
可能吧。这取决于你如何实现该模式,但 GoF 书在第 90 页确实承认了这个问题。
支持新产品很困难。将抽象工厂扩展到
生产新品种的产品并不容易。那是因为 AbstractFactory
界面修复了可以创建的产品集。支持新品种
产品需要扩展工厂接口,这涉及到更改
AbstractFactory 类及其所有子类。我们讨论一种解决方案
这个问题在实现部分。
GoF书中提到的解决方案是对Abstract Factory方法进行参数化,这会导致其自身的一系列问题。
...这在 Web 开发中并不常见?
不,这不对。在编写 GoF 书时,依赖注入还不是常见的模式,但如今它几乎取代了对抽象工厂的需求。今天,我几乎愿意将抽象工厂称为反模式。但我仍然持开放态度,认为可能存在比 DI 更适合 AF 的问题。我只是还没有看到一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)