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

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


当前回答

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

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

...

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

}

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

其他回答

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

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());
    }

}

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