战略设计模式和抽象工厂模式有什么区别?

时间:2011-02-07 20:38:17

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

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

3 个答案:

答案 0 :(得分:8)

INTENT 与结构和实施细节不同。一旦你掌握了INTENT具有重要意义的基本想法,那么你就会走上正确的道路。

Understand the role of intent in design patterns

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

  1. 定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。
  2. 在界面中捕获抽象,将实现细节隐藏在派生类中。
  3. 抽象工厂的意图。这是一种创造性模式

    1. 提供用于创建相关或从属对象族的接口,而无需指定其具体类。
    2. 一个层次结构,它封装了:许多可能的“平台”,以及一套“产品”的构建。

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

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

另一方面,策略设计模式允许您通过使用“拥有”关系而不是“是一种”关系来更好地控制层次结构。因为如果我们试图在更复杂的场景中使用继承(是a),那么我们可能必须覆盖代代相继的方法,并避免代码重用。

假设您创建了一个Animal类(或接口),并且您正在使用移动方法。

你希望通过扩展它来创建一个鸟类。因此,您将在move()方法下添加飞行功能。但企鹅的情况如何呢?他们将有步行功能。

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

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

enter image description here

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

  1. Factory Design pattern

  2. Strategy Design pattern