【发布时间】: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() 提供实现。
模板方法基本特征:父类具体方法调用其抽象方法。
工厂方法:让产品创建由其子类实现。
以上示例适用于两者。事实上,工厂方法的任何示例也适用于模板方法。
这么说也不错
- 工厂方法模式是专门的模板方法模式,用于获取其实现依赖于用户代码的对象,可以在子类中提供对象创建的实现
- 如果用于对象创建的模板模式是工厂方法模式。
我的第二个疑问:Factory 方法(根据 GOF 基于 inberitence)是否必须从其他具体方法调用其抽象产品生产方法?
如果上面的答案是“否”,那么这意味着会有一些消费者代码将有一个工厂类型的实例(组合),将调用工厂方法来获取产品的对象,并将获得具体的工厂类注入。但是现在这变成了抽象工厂。
【问题讨论】:
-
我会说Factory是一种使用Strategy的方式,通常Factory根据接收到的参数创建对象,这意味着创建对象的行为取决于输入,因此工厂选择正确的策略创建请求的对象,运行策略并将结果返回给工厂的调用者
-
工厂,你的意思是抽象工厂或工厂方法,还是静态工厂方法?所有 3 种都是不同的,根据 GOF,只有工厂方法和抽象工厂是设计模式。
-
确实是抽象工厂,并试图回答这个问题,我会说工厂方法是一种创造行为,因此是一种策略
-
嗯,有趣的观点。
creational behaviour因此工厂方法是策略。为此 +1 -
你说的是模板方法而不是策略?
标签: java oop design-patterns factory-method template-method-pattern