Java 工厂方法模式是模板方法模式的特例吗?

Java 工厂方法模式是模板方法模式的特例吗?,java,oop,design-patterns,factory-method,template-method-pattern,Java,Oop,Design Patterns,Factory Method,Template Method Pattern,GOF讨论了“工厂方法”模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要返回类型,因此定义了所需对象的接口,它定义了该对象所需的API。实际对象由子类(具体应用程序)创建。这是一种创造性的模式 对于模板模式,唯一的变化是封装类不知道特定行为的实现,因此它将其抽象到方法中,使用它,但将实现留给子类。这就是行为模式 两者之间唯一的区别是 1. Factory method is creational and Template is behaviour

GOF讨论了“工厂方法”模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要返回类型,因此定义了所需对象的接口,它定义了该对象所需的API。实际对象由子类(具体应用程序)创建。这是一种创造性的模式

对于模板模式,唯一的变化是封装类不知道特定行为的实现,因此它将其抽象到方法中,使用它,但将实现留给子类。这就是行为模式

两者之间唯一的区别是

1. Factory method is creational and Template is behavioural.
2. Factory method abstracts a method to create an object where as template pattern abstracts a method for some policy or algorithm. 
示例代码

 /**factory-method example**/
 public abstract class Application{          
        public void create(){
              View contentView = createContentView();
              Menu menu = contentView.obtainMenu();
              generateMenuItems(menu);
        }
        public abstract View createContentView(); //factory-method
        public void generateMenuItems(Menu menu){
              // some code
        }
 }

  /** Product Specification**/            
 public interface View{
      public abstract Menu obtainMenu();
      // other abstract method of product
 }
现在,使用上面的用户代码将对应用程序进行子类化,并为
createContentView()
提供实现

模板方法基本特征:调用其抽象方法的父类具体方法

工厂方法:让产品创建由其子类实现

上述示例适用于这两种情况。事实上,工厂方法的任何示例也适用于模板方法

这么说很好

  • 工厂方法模式是一种专门的模板方法模式,用于获取对象,该对象的实现依赖于用户代码,用户代码可以在子类中提供对象创建的实现
  • 用于对象创建的模板模式是Factory方法模式
  • 我的第二个疑问是:工厂方法(根据GOF基于先天性)是否必须从其他具体方法调用其抽象产品生产方法


    如果上面的答案是“否”,那么这意味着将有一些消费者代码,其中将有一个类型为Factory(composition)的实例,将调用Factory方法来获取产品的对象,并将注入具体的Factory类。但现在这变成了抽象工厂

    我不想过分简化这些模式,但是,是的,两种抽象都完全推迟了实现细节。将客户机与实现细节分离更加灵活,并允许每个客户机独立发展;这就是依赖倒置原理的本质

    • 工厂方法完全推迟了创建
    • 策略完全推迟了行为
    针对上述评论:

    • 模板方法部分延迟行为(不完全相同)
    这些模式不是专门使用的,例如,策略可以使用模板方法、工厂方法或其他模式


    我希望这有帮助

    工厂方法模式和模板方法模式的设计相似,但它们的用途不同

    工厂方法是一种创建模式,其中对象创建是子类的责任

    工厂方法是一种模式,其中一个类为对象创建定义了一个抽象方法,另一个方法使用创建的对象,从而允许子类提供创建方法的实现

    模板方法是一种行为模式,其中行为是子类的责任

    一种模式,其中一个类为一个行为定义一个抽象方法,另一个方法调用该抽象方法来执行该行为,该行为由子类实现。因此,它是调用子类实现的父类,而不对其子类具有任何显式编译时依赖关系。工厂方法模式也是如此。但两者的意图不同


    换句话说,我们可以说工厂方法模式创建对象的方式与模板方法模式执行行为的方式类似。

    我想说工厂是一种使用策略的方式,通常工厂根据接收到的参数创建对象,这意味着创建对象的行为取决于输入,因此,工厂选择正确的策略来创建请求的对象,运行该策略并将结果返回给FactoryFactory的调用方,您是指抽象工厂或工厂方法,还是静态工厂方法?。这三个都是不同的,根据GOF的说法,只有工厂方法和抽象工厂是设计模式。抽象工厂确实是,为了回答这个问题,我想说工厂方法是一种创造性的行为,因此是一个有趣的战略视角<代码>创造性行为,因此工厂方法就是策略+1因为这似乎你们在谈论模板方法而不是策略?我真的很抱歉,我错写了策略,但我指的是模板模式。对于这个可怕的错误,我真的很抱歉。:)我纠正了it@Rafael通过
    策略可以使用模板方法、工厂方法…
    您的意思是可以使用模板或工厂方法设计模式来实现策略?@valentinenu任何实现细节都可以在抽象背后接受。策略实现或任何实现也可以由/利用其他模式组成。实现细节是客户端不应该关心的黑盒。如果他们这样做了,就会出问题(破坏封装、紧密耦合等)。@nits.kk我不知道还能说什么。。。这两种抽象都将细节推迟到子类,但它们的职责不同:一种是创建/完全委托,另一种是行为/部分委托。这有意义吗?@Rafael
    任何实现细节都可以在抽象之后接受
    +1