有人能解释一下工厂模式和战略模式之间的区别吗?

对于我来说,两者看起来是一样的,除了一个额外的工厂类(在工厂模式中创建一个product对象)


当前回答

您不能仅仅通过查看代码或分类来理解其中的区别。要正确掌握GoF模式,请寻找它们的意图:

策略:“定义一系列算法,封装每个算法,并使它们可互换。策略让算法独立于使用它的客户而变化。”

工厂方法:定义一个用于创建对象的接口,但是让子类来决定实例化哪个类。工厂方法允许类延迟实例化到子类。

下面是关于这两种模式的意图和区别的详细解释:工厂方法和策略设计模式的区别

其他回答

简而言之:

工厂是用于创建具有相同行为的多个对象,而策略是用于具有不同工作方式的一个对象。

根据奥斯卡的说法和他的准则:

getCommand是工厂类,UnixCommand、WindowsCommand和OSXCommand类是策略类

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

Factory(和Factory返回的FactoryMethod):

创建型模式 基于继承 工厂返回一个工厂方法(接口),该方法返回具体对象 你可以用新的具体对象代替接口,客户端(调用者)不应该知道所有的具体实现 客户端始终只访问接口,您可以在Factory方法中隐藏对象创建细节

看看这篇维基百科和javarevisited的文章

策略模式:

这是一种行为模式 它是基于委派的 它通过修改方法行为来改变对象的内容 它用来在一系列算法之间切换 它在运行时改变对象的行为

例子:

您可以为特定的项目(机票或购物车项目)配置折扣策略。在本例中,您将在7月至12月期间提供25%的折扣,而在1月至6月期间不提供折扣。

相关文章:

策略模式的真实例子

设计模式:工厂vs工厂方法vs抽象工厂

工厂(方法)模式。

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

战略模式。

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

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

所以。如果你的Factory方法是固定的,你可以像这样:

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

但是假设您的工厂需要更高级或更动态的创建。你可以在工厂方法中添加策略并在不需要重新编译的情况下更改它,策略可以在运行时更改。