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

6

有人能彻底解释一下这两者之间的区别,并尝试提供一种使用它们的指南吗?例子会很好。

3个回答

9
意图(INTENT)与结构和实现细节不同。一旦您掌握了这个基本思想,即意图至关重要,那么您就会走上正确的道路。 了解设计模式中意图的作用 策略模式(Strategy)的意图。这是一种行为型模式。
  1. 定义一组算法,将每个算法封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户端而变化。
  2. 在接口中捕获抽象,将实现细节放入派生类中。
抽象工厂模式(Abstract Factory)的意图。这是一种创建型模式。
  1. 提供一个接口,用于创建相关或依赖对象的对象家族,而无需指定其具体类。
  2. 封装许多可能的“平台”以及一套“产品”的构建。

那么,每个算法的意图/目的是什么?我记得策略更与选择正确的算法有关...但找不到可靠的东西。 - RanZilber

7

策略模式是一种解决没有一级函数的语言的方法。您可以传递一个策略对象来决定某些您想要与其余代码分离的策略。比如在Java中进行排序时,使用比较器(Comparator)作为策略对象,它允许您单独指定排序策略而不影响排序算法。这使您可以通过插入不同的策略来重用代码。

抽象工厂是用于创建其他对象的对象,其中抽象部分是您有一个工厂返回工厂的实现,而工厂的用户通过接口访问它。因此,一个工厂实现可以被另一个替换而不影响工厂的用户,因为这些用户只依赖于对象的接口。


我对工厂模式和策略模式感到困惑,因为有些用于描述策略模式的示例代码可以使用工厂模式进行重写。也许最好提供一个例子来帮助我们理解它们之间的区别。 - frank

0

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

另一方面,策略设计模式允许您使用“具有”关系而不是“是”关系更好地控制分层结构。因为如果我们在更复杂的情况下尝试使用继承(是一个),那么我们可能必须覆盖代代继承的方法,这会避免代码重用。

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

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

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

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

enter image description here

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

  1. 工厂设计模式

  2. 策略设计模式


更好的做法是,即使回答更好,我也鼓励你在普遍情况下小心链接到自己的博客。这个回答符合“披露”要求,但基本上只是毫无意义的废话。如果有太多这样的回答,你可能仍然会被标记为垃圾邮件。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接