【问题标题】:What is the diffrence between strategy design pattern and abstract factory pattern?策略设计模式和抽象工厂模式有什么区别?
【发布时间】:2011-02-07 20:38:17
【问题描述】:

有人可以一劳永逸地向我解释这两者之间的区别,并尝试给出一种何时使用它们的指南吗?例子真的很好。

【问题讨论】:

    标签: design-patterns strategy-pattern abstract-factory


    【解决方案1】:

    意图不同于结构和实施细节。一旦你掌握了这个基本的想法,即 INTENT 很重要,那么你就会走上正确的道路。

    Understand the role of intent in design patterns

    Intent for Strategy。这是一种行为模式

    1. 定义一系列算法,封装每个算法,并使它们可互换。策略让算法独立于使用它的客户而变化。
    2. 在接口中捕获抽象,将实现细节隐藏在派生类中。

    抽象工厂的意图。这是一种创造模式

    1. 提供用于创建相关或依赖对象系列的接口,而无需指定它们的具体类。
    2. 一个层次结构,其中包含:许多可能的“平台”,以及一套“产品”的构造。

    【讨论】:

    • 好吧,那么,他们每个人的目的/目的是什么?我记得 startegy 与选择正确的算法更相关……但找不到可以依赖的东西
    【解决方案2】:

    对于没有一流功能的语言,策略是一种解决方法。您传入一个策略对象,该对象决定您希望将其与其余代码分开的某些策略。想想 Java 中的排序以及它们如何使用 Comparator,Comparator 是一个策略对象,它允许您指定与排序算法分开的排序策略。这使您可以通过采用不同的策略来重用代码。

    抽象工厂是一个用于创建其他对象的对象,抽象部分是您有一个工厂,它返回工厂的实现,工厂的用户通过接口访问它。因此,可以将一个工厂实现换成另一种,而不需要改变工厂的用户,因为这些用户只依赖于对象的接口。

    【讨论】:

    • 我对工厂模式和策略模式感到困惑,我认为它们是相同的,因为一些描述策略模式的示例代码可以用工厂模式重写。也许最好有一个例子让我们了解它们的差异。
    【解决方案3】:

    工厂设计模式充当工厂,并根据您的要求在运行时生成不同类型的对象。所以控制是在运行时进行的,你可以在运行时决定你需要的对象。所以对象之间的耦合会减少。

    另一方面,策略设计模式允许您通过使用“具有”关系而不是“是”关系来更好地控制层次结构。因为如果我们想在更复杂的场景中使用继承(is a),那么我们可能不得不覆盖几代人继承的方法,这样可以避免代码重用。

    假设您创建了一个 Animal 类(或接口),并且其中有一个 move 方法。

    你希望通过扩展它来创建一个鸟类。因此,您将在 move() 方法下添加飞行功能。但是企鹅是怎么回事?它们将具有步行功能。

    因此,每次通过扩展 Animal 类创建动物时,都必须一次又一次地重写 move() 方法。您可以清楚地理解 move() 方法更容易受到更改,因此最佳实践是将更改部分与核心代码分开。

    我们可以简单地为 move() 方法创建一个单独的层次结构。您可以通过 setter 方法将相关的 move() 方法分配给对象。所以控制权交给了运行时。下图说明了这一事实;

    以下是我的 2 篇博文,如果您愿意,可以参考它们以获取更多详细信息。

    1. Factory Design pattern

    2. Strategy Design pattern

    【讨论】:

    • 更好。我鼓励您注意不要经常链接到您的博客,即使有更好的答案。这符合“披露”要求,但几乎只是毫无意义的绒毛。像这样的答案太多了,你可能仍然被标记为垃圾邮件。
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2015-12-28
    • 2010-12-12
    • 2012-06-26
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多