5

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

4

3 回答 3

8

除了结构和实现细节之外,意图是不同的。一旦你掌握了意图很重要的基本思想,那么你就会走上正确的道路。

理解意图在设计模式中的作用

战略意图。这是一种行为模式

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

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

  1. 提供用于创建相关或依赖对象系列的接口,而无需指定它们的具体类。
  2. 封装的层次结构:许多可能的“平台”,以及一套“产品”的构建。
于 2011-02-07T20:41:43.207 回答
7

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

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

于 2011-02-07T21:17:55.730 回答
0

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

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

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

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

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

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

在此处输入图像描述

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

  1. 工厂设计模式

  2. 策略设计模式

于 2012-09-06T20:14:54.000 回答