当前位置: 首页 > 知识库问答 >
问题:

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

吕霖
2023-03-14

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()提供实现。

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

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

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

所以说是好事

  1. 工厂方法模式是一种专门的模板方法模式,用于获取对象,其实现取决于用户代码,该代码可以在子类中提供对象创建的实现

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

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


共有2个答案

洪凯定
2023-03-14

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

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

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

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

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

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

刘胜泫
2023-03-14

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

  • 工厂方法完全推迟了创建
  • 策略完全推迟了行为

针对上述评论:

  • 模板方法部分延迟了行为(不完全相同)

这些模式不是专门使用的,例如,策略可以使用模板方法、工厂方法或其他模式。

我希望这有帮助!

 类似资料:
  • 亦称: 虚拟构造函数、Virtual Constructor、Factory Method 意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 问题 假设你正在开发一款物流管理应用。 最初版本只能处理卡车运输, 因此大部分代码都在位于名为 卡车的类中。 一段时间后, 这款应用变得极受欢迎。 你每天都能收到十几次来自海运公司的请求, 希望应用

  • 工厂方法模式是一种实现了「工厂」概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是「定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。」 var Humanity = (function() { function Man() { this.introduce = fu

  • 问题 直到开始运行你才知道需要的是什么种类的对象。 解决方案 使用 工厂方法(Factory Method) 模式和选择对象都是动态生成的。 你需要将一个文件加载到编辑器,但是直到用户选择文件时你才知道它的格式。一个类使用工厂方法 ( Factory Method ) 模式可以根据文件的扩展名提供不同的解析器。 class HTMLParser constructor: ->

  • 简介 “工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应

  • 一、工厂方法模式简介 1.定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,

  • 亦称: Template Method 意图 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 (PDF、 DOC 或 CSV) 的文档, 程序则会试图从这些文件中抽取有意义的数据, 并以统一的格式将其返回给用户。 该程序的首个版本仅支持 DOC 文