【问题标题】:Is Factory method pattern a specialized case of Template method pattern?工厂方法模式是模板方法模式的特例吗?
【发布时间】:2019-08-23 00:01:36
【问题描述】:

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

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

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

【问题讨论】:

  • 我会说Factory是一种使用Strategy的方式,通常Factory根据接收到的参数创建对象,这意味着创建对象的行为取决于输入,因此工厂选择正确的策略创建请求的对象,运行策略并将结果返回给工厂的调用者
  • 工厂,你的意思是抽象工厂或工厂方法,还是静态工厂方法?所有 3 种都是不同的,根据 GOF,只有工厂方法和抽象工厂是设计模式。
  • 确实是抽象工厂,并试图回答这个问题,我会说工厂方法是一种创造行为,因此是一种策略
  • 嗯,有趣的观点。 creational behaviour 因此工厂方法是策略。为此 +1
  • 你说的是模板方法而不是策略?

标签: java oop design-patterns factory-method template-method-pattern


【解决方案1】:

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

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

解决上面的评论:

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

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

我希望这会有所帮助!

【讨论】:

  • 我真的很抱歉,我错误地写了 stategy,但我的意思是模板模式。真的为这个可怕的错误感到抱歉。 :) 我纠正了它
  • @Rafael Strategy can use Template Method, Factory Method... 你的意思是可以使用模板或工厂方法设计模式来实现策略?
  • @ValentinCarnu 抽象背后的任何实现细节都是可以接受的。策略实现或任何实现也可以由/利用其他模式组成。实施细节是客户不应该关心的黑匣子。如果他们这样做了,那就是有问题(破坏封装、紧密耦合等)。
  • @nits.kk 我不知道还能说什么......这两个抽象都将细节推迟到子类,但它们的职责不同:一个是创建/完全委托,而另一个是行为/部分代表团。这有意义吗?
  • @Rafael Any implementation detail is acceptable behind an abstraction +1
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多