Java 工厂模式和战略模式之间的区别是什么?

Java 工厂模式和战略模式之间的区别是什么?,java,design-patterns,factory-pattern,strategy-pattern,abstract-factory,Java,Design Patterns,Factory Pattern,Strategy Pattern,Abstract Factory,有人能解释工厂模式和战略模式之间的区别吗 对我来说,除了一个额外的factory类(它在factory模式中创建产品对象)之外,两者看起来都一样。factory模式是一种创造性模式。战略模式是一种运作模式。换句话说,工厂模式用于创建特定类型的对象。策略模式用于以特定方式执行操作(或一组操作)。在经典的例子中,工厂可能会创造不同类型的动物:狗、猫、老虎,而策略模式会执行特定的动作,例如移动;使用跑步、步行或爬坡策略 事实上,两者可以一起使用。例如,您可能有一个创建业务对象的工厂。它可以根据持久性介

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


对我来说,除了一个额外的factory类(它在factory模式中创建产品对象)之外,两者看起来都一样。

factory模式是一种创造性模式。战略模式是一种运作模式。换句话说,工厂模式用于创建特定类型的对象。策略模式用于以特定方式执行操作(或一组操作)。在经典的例子中,工厂可能会创造不同类型的动物:狗、猫、老虎,而策略模式会执行特定的动作,例如移动;使用跑步、步行或爬坡策略


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

策略模式允许您以多态方式更改类的行为

factory模式允许您封装对象创建


加里说得很好。如果您使用的是抽象编码而不是“具体化”的原则,那么许多模式开始看起来像是主题的变体。

只需补充tvanfosson所说的,许多模式在实现方面看起来是相同的。也就是说,您在代码中创建了一个以前没有的接口,然后创建了该接口的一系列实现。区别在于它们的用途和使用方式。

  • 工厂(方法)模式
仅创建具体实例。不同的参数可能导致不同的对象。这取决于逻辑等等

  • 战略模式
封装算法(步骤)以执行操作。因此,您可以更改策略并使用另一种算法

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

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

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

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

要扩展Oscar所说的内容并参考其代码:


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

我可能会偏离Oscar,因为他的工厂实现示例是紧密耦合且非常封闭的,难怪您选择的是策略模式。工厂实现不应依赖于实例化的任何固定数量的特定类,例如:

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

...

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

}

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

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

首先,必须区分简单工厂和抽象工厂。第一个是一个简单的工厂,其中只有一个类作为对象创建的工厂,而在后者中,您连接到工厂接口(定义方法名称)然后调用实现该接口的不同工厂,这些工厂应该基于某些条件对同一方法有不同的实现。例如,我们有一个ButtonCreationFactory接口,它由两个工厂实现,第一个是WindowsButtonCreationFactory(创建具有Windows外观的按钮),第二个是LinuxButtonCreationFactory(创建具有Linux外观的按钮)。因此,这两个工厂都有相同的创建方法和不同的实现(算法)。您可以在运行时根据所需的按钮类型的方法引用它

例如,如果您想要具有Linux外观的按钮:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
或者如果你想要Windows按钮

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

正是在这种情况下,它产生了一种策略模式,因为它区分了用于进行某些创建的算法。但是,它在语义上不同于它,因为它用于对象创建,而不是操作算法。因此,基本上抽象工厂使用不同的策略创建对象,这使得它与策略模式非常相似。然而,抽象工厂是创造性的,而战略模式是可操作的。就实现而言,它们的结果是相同的。

工厂模式是一种创造性模式,它是用指定的属性(行为)创建的。而在创建后的运行时,您不能更改它的属性(行为)。因此,如果您需要不同的属性(行为),您必须删除该对象并创建具有所需属性(行为)的新对象。这不是古德。
而对于策略模式,u可以在运行时更改属性(行为)。

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

策略:“定义一系列算法,封装每一个算法,并使它们可互换。策略让算法