回答

146

甲工厂模式是创建模式相同其它。策略模式是一种操作模式。换句话说,工厂模式用于创建特定类型的对象。策略模式用于以特定方式执行操作(或操作集合)。在典型的例子中,工厂可能会创建不同类型的动物:狗,猫,老虎,而战略模式会执行特定的动作,例如移动;使用Run,Walk或者Lope策略。

其实两者可以一起使用。例如,您可能有一个创建您的业务对象的工厂。它可能会根据持久性媒介使用不同的策略。如果您的数据本地存储在XML中,它将使用一种策略。如果数据远程位于不同的数据库中,则会使用另一个数据库。

20

策略模式允许您多态地改变一个类的行为。

工厂模式允许您封装对象创建。

加里说得很好。如果你使用抽象的原则而不是“结实”,那么很多模式开始看起来像一个主题的变化。

15

只是为了增加tvanfosson的说法,很多模式看起来和实现一样。也就是说,你可以创建一个接口,在你的代码中可能没有一个接口,然后创建一个接口的实现。差异在于它们的目的以及它们的使用方式。

9
  • 工厂(方法)模式。

仅创建具体实例。不同的参数可能会导致不同的对象。这取决于逻辑等。

  • 战略模式。

封装算法(步骤)以执行操作。所以你可以改变策略并使用另一种算法。

虽然两者看起来非常相似,但目的却相当不同,其中一个目的是创建另一个就是执行一个动作。

所以。如果你的工厂方法是固定的,你可能会这样:

public Command getCommand(int operatingSystem) { 
     switch(operatingSystem) { 
      case UNIX : 
      case LINUX : return new UnixCommand(); 
      case WINDOWS : return new WindowsCommand(); 
      case OSX  : return new OSXCommand(); 
     } 
    } 

但假设你的工厂需要更先进或动态创建。您可以向工厂方法添加策略并在无需重新编译的情况下对其进行更改,策略可能会在运行时更改。

+0

我不认为你在这里做一个合适的点。首先,这些模式的原因之一是为了避免有利于多态的条件。首先必须做出简单工厂和抽象工厂之间的区别。d第一个是一个简单的工厂,其中只有一个类用作对象创建的工厂,而后者则连接到一个接口,然后调用实现此接口的不同工厂,这些工厂应该具有不同的基于某些标准的相同方法。 (继续) – interboy 2013-01-27 23:49:13

2

为了扩大在什么奥斯卡之称,并参考其代码:

的getCommand是厂家和UnixCommand,WindowsCommand和OSXCommand类是战略

1

我可以在他的例子奥斯卡离题一个工厂的实施是相当紧密耦合,非常封闭,难怪你的选择是战略模式。工厂实现不应依赖于任何固定数量的特定类的实例化,例如:

public Command getCommand(int operatingSystem) {   
    return commandTable.get(operatingSystem); 
} 

... 

public class WindowsCommand implements Command { 
    ... 
    static { 
     CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand()); 
    } 

} 

我想最合适的标准来选择一种或另一种主要是你雇用命名您的类和方法的条款,考虑到我们都应该倾向于编程接口而不是类,并且还关注目标:我们的目标是确定哪些代码将在运行时执行。也就是说,我们可以通过使用这两种模式来实现目标。

1

战略和工厂是不同的目的。在策略中你定义了方法,使用这个模式你可以交换行为(算法)。来到工厂周围有很多变化。但是从GO4状态工厂的原始模式将对象创建为子类。在工厂中,您正在替换完整的实例而不是您感兴趣的行为。由此,您将取代完整的系统而不是算法。

5

首先是简单工厂和抽象工厂之间的差异。第一个是一个简单的工厂,其中只有一个类用作对象创建的工厂,而后者则连接到一个工厂接口(它定义方法名称),然后调用实现此接口的不同工厂基于一些标准应该有相同方法的不同实现。例如,我们有一个ButtonCreationFactory接口,它由两个工厂实现,第一个WindowsButtonCreationFactory(创建具有Windows外观的按钮)和第二个LinuxButtonCreationFactory(创建具有Linux外观的按钮)。所以这两个工厂都有不同的实现(算法)具有相同的创建方法。你可以在运行时根据你想要的按钮类型来引用它。

例如,如果你想用Linux的外观和感觉的按钮:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

,或者如果你想让Windows按钮

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

正是在这种情况下,它会导致一种策略模式,因为它区分用于做一些创建的算法。然而,它在语义上与它不同,因为它用于OBJECT CREATION而不是运算法则。所以,基本上抽象工厂使用不同的策略来创建对象,这使得它与战略模式非常相似。然而,AbstractFactory是创建的,而Strategy模式是可操作的。实施方面,他们的结果是一样的。

0

工厂模式是创建模式,它是用指定的属性(行为)创建的。而在创建之后的运行时,您不能更改它的属性(行为)。所以如果你需要不同的属性(行为),你必须删除对象,并创建具有所需属性(行为)的新对象。这是不是gud。 而在战略模式的情况下,您可以在运行时更改属性(行为)。

0

只是通过查看代码或分类,你无法理解差异。要正确掌握GoF模式,请查找他们的意图:

策略:“定义一系列算法,封装每个算法,并使它们可以互换。策略使算法独立于使用它的客户端。工厂方法:“定义一个创建对象的接口,但让子类决定实例化哪个类。Factory方法让类将实例化推迟到子类。”

这里是关于意图和这两种模式之间的差异精心解释:简单来说Difference between Factory Method and Strategy design patterns

2

策略模式更是创造运行时的行为,你不关心实现类。另一方面,工厂是具体类实例的运行时创建,您可以使用由实现的接口公开的任何行为(方法)。

3

厂(和FactoryMethod返回由厂):基于继承

  1. 创建模式
  2. 厂返回工厂方法(接口),这反过来又返回具体对象
  3. 你可以替换新的具体对象用于接口和客户端(呼叫者)不应该知道所有具体的实现
  4. Cl ient总是只能访问接口,你可以隐藏对象创建的细节在工厂方法

看一看这个wikipedia articlejavarevisited article

策略模式:

  1. 这是一种行为模式
  2. 它基于委托
  3. 它通过修改我改变对象的胆量的ThOD行为
  4. 它用于家庭的算法之间切换
  5. 它改变在运行时对象的行为

例子:

可以配置为特定项目折扣策略(机票票或ShoppingCart项目)。在这个例子中,你将在七月至十二月期间对一件商品提供25%的折扣,并且在六月的Jaunary期间对这件商品没有折扣。

相关文章:

Real World Example of the Strategy Pattern

Design Patterns: Factory vs Factory method vs Abstract Factory

相关问题