GOF讨论“工厂方法”模式的框架。框架需要对象,但是对象的实现取决于应用程序,因此创建了创建对象的抽象方法。同样,由于需要返回类型,因此定义了所需对象的接口,它定义了对象所需的api。实际对象由子类创建(具体应用程序)。这是一种创造模式。
对于Template模式,唯一的变化是封装类不知道某些行为的实现,因此将其抽象到一个方法中,使用它,但将实现留给子类。这是行为模式。
两者之间唯一的区别是
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
}
现在,使用上述代码的用户代码将子类化Application并为createContentView()
提供实现。
模板方法的基本特征:调用其抽象方法的父类具体方法。
Factory方法:通过其子类实现产品创建。
以上示例均适用于两者。实际上,任何适用于Factory方法的示例也适用于Template方法。
所以很好说
我的第二个疑问:工厂方法(根据基于无性的GOF)是否必须从其他具体方法中调用其抽象产品生产方法?
如果以上回答为“否”,则意味着会有一些消费者代码,其代码类型为Factory(组成),将调用factory方法获取产品对象并获得具体的工厂类注射。但是现在这变成了抽象工厂。
答案 0 :(得分:1)
我不想过分简化这些模式,但是,是的,两个抽象完全延迟了实现细节。将客户端与实现细节分离,更加灵活,并允许每个客户端独立发展。这是依赖倒置原则的本质。
要解决以上评论:
这些模式不是专用的,例如,策略可以使用模板方法,工厂方法或其他模式。
我希望这会有所帮助!
答案 1 :(得分:0)
Factory方法模式和Template方法模式的设计相似,但是它们的用途有所不同。
工厂方法是一种创建模式,其中对象的创建是子类的责任。
一种模式,其中一个类为对象创建定义了一个抽象方法,而另一个使用所创建对象的方法(从而允许子类提供创建方法的实现)为工厂方法。
模板方法是一种行为模式,其中行为是子类的责任。
一种模式,其中一个类为行为定义了一个抽象方法,另一个方法调用了该抽象方法以执行该行为,该行为由子类实现。因此,它的父类调用子类的实现,而对其子类没有任何显式的编译时依赖性。对于工厂方法模式也是如此。但是两者的意图不同。
换句话说,我们可以说Factory方法模式创建对象的方式与模板方法模式执行行为的方式类似。