【发布时间】:2011-02-07 20:38:17
【问题描述】:
有人可以一劳永逸地向我解释这两者之间的区别,并尝试给出一种何时使用它们的指南吗?例子真的很好。
【问题讨论】:
标签: design-patterns strategy-pattern abstract-factory
有人可以一劳永逸地向我解释这两者之间的区别,并尝试给出一种何时使用它们的指南吗?例子真的很好。
【问题讨论】:
标签: design-patterns strategy-pattern abstract-factory
意图不同于结构和实施细节。一旦你掌握了这个基本的想法,即 INTENT 很重要,那么你就会走上正确的道路。
Understand the role of intent in design patterns
Intent for Strategy。这是一种行为模式
抽象工厂的意图。这是一种创造模式
【讨论】:
对于没有一流功能的语言,策略是一种解决方法。您传入一个策略对象,该对象决定您希望将其与其余代码分开的某些策略。想想 Java 中的排序以及它们如何使用 Comparator,Comparator 是一个策略对象,它允许您指定与排序算法分开的排序策略。这使您可以通过采用不同的策略来重用代码。
抽象工厂是一个用于创建其他对象的对象,抽象部分是您有一个工厂,它返回工厂的实现,工厂的用户通过接口访问它。因此,可以将一个工厂实现换成另一种,而不需要改变工厂的用户,因为这些用户只依赖于对象的接口。
【讨论】:
工厂设计模式充当工厂,并根据您的要求在运行时生成不同类型的对象。所以控制是在运行时进行的,你可以在运行时决定你需要的对象。所以对象之间的耦合会减少。
另一方面,策略设计模式允许您通过使用“具有”关系而不是“是”关系来更好地控制层次结构。因为如果我们想在更复杂的场景中使用继承(is a),那么我们可能不得不覆盖几代人继承的方法,这样可以避免代码重用。
假设您创建了一个 Animal 类(或接口),并且其中有一个 move 方法。
你希望通过扩展它来创建一个鸟类。因此,您将在 move() 方法下添加飞行功能。但是企鹅是怎么回事?它们将具有步行功能。
因此,每次通过扩展 Animal 类创建动物时,都必须一次又一次地重写 move() 方法。您可以清楚地理解 move() 方法更容易受到更改,因此最佳实践是将更改部分与核心代码分开。
我们可以简单地为 move() 方法创建一个单独的层次结构。您可以通过 setter 方法将相关的 move() 方法分配给对象。所以控制权交给了运行时。下图说明了这一事实;
以下是我的 2 篇博文,如果您愿意,可以参考它们以获取更多详细信息。
【讨论】: