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

nit*_*.kk 5 java oop design-patterns factory-method template-method-pattern

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. 
Run Code Online (Sandbox Code Playgroud)

示例代码

 /**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
 }
Run Code Online (Sandbox Code Playgroud)

现在使用上面的用户代码将子类化应用程序并提供实现createContentView().

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

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

上面的例子适合两者。事实上,工厂方法的任何示例也适合模板方法。

所以说很好

  1. 工厂方法模式是专门用于获取对象的模板方法模式,其实现依赖于用户代码,可以在子类中提供对象创建的实现
  2. 如果用于对象创建的模板模式是工厂方法模式。

我的第二个疑问:工厂方法(根据基于 inberitence 的 GOF)是否必须从其他具体方法调用其抽象产品生产方法?

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

nit*_*.kk 4

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

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

工厂方法是一个类定义一个用于创建对象的抽象方法和使用所创建的对象的另一个方法,从而允许子类提供创建方法的实现的模式。

模板方法是一种行为模式,其中行为由子类负责。

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

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