工厂方法模式是模板方法模式的特例吗?
Is Factory method pattern a specialized case of Template method pattern?
GOF 谈论 "Factory method" 模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要 return 类型,因此定义了所需对象的接口,它定义了对象所需的 api。实际对象由 subclasses (concrete Application) 创建。这是一种创造模式。
对于模板模式,唯一的变化是封装 class 不知道某些行为的实现,因此它在方法中抽象它,使用它但将实现留给子 class es。这是行为模式。
两者唯一的区别是
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
}
现在使用上面的用户代码将子class 应用程序并为createContentView()
提供实现。
模板方法的基本特征:父类class调用其抽象方法的具体方法。
工厂方法:让产品创建由其子 classes 实现。
以上示例适用于两者。事实上,工厂方法的任何示例也适用于模板方法。
这么说也好
- 工厂方法模式是专门用于获取对象的模板方法模式,其实现依赖于用户代码,可以在子class[中提供对象创建的实现=42=]
- 如果用于对象创建的模板模式是工厂方法模式。
我的第二个疑问: 工厂方法(按照GOF的无规律性)是否必须从其他具体方法调用其抽象产品生产方法?
如果上面的答案是'No'那么这意味着会有一些消费者代码将有一个类型工厂(组合)的实例,将调用工厂方法来获取产品的对象并将注入混凝土工厂 class。但是现在这变成了抽象工厂。
我不想过度简化这些模式,但是,是的,两种抽象都完全推迟了实现细节。将客户端与实现细节解耦更加灵活,并允许每个客户端独立发展;这就是依赖倒置原则的本质。
- 工厂方法延迟创建完全
- 策略延迟行为完全
解决上面的评论:
- 模板方法延迟行为部分(不完全相同)
这些模式不是专门使用的,例如,策略可以使用模板方法、工厂方法或其他模式。
希望对您有所帮助!
工厂方法模式和模板方法模式的设计相似,但用途不同。
工厂方法是一种创建模式,其中 object 创建是 child class 的责任。
一种模式,其中 class 为 object 创建定义一个抽象方法,并使用创建的 object 定义另一个方法,从而允许子 class 提供创建方法的实现是工厂方法
模板方法是一种行为模式,其中行为由子程序负责 class。
一种模式,其中一个class为一个行为定义了一个抽象方法,另一个方法调用抽象方法来执行该行为,该行为由子class实现。因此,它的 parent class 调用 child class 的实现,而不对其子 class 有任何明确的编译时依赖性。工厂方法模式也是如此。但两者的意图不同。
换句话说,我们可以说工厂方法模式创建 object 类似于模板方法模式执行行为。
GOF 谈论 "Factory method" 模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要 return 类型,因此定义了所需对象的接口,它定义了对象所需的 api。实际对象由 subclasses (concrete Application) 创建。这是一种创造模式。
对于模板模式,唯一的变化是封装 class 不知道某些行为的实现,因此它在方法中抽象它,使用它但将实现留给子 class es。这是行为模式。
两者唯一的区别是
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
}
现在使用上面的用户代码将子class 应用程序并为createContentView()
提供实现。
模板方法的基本特征:父类class调用其抽象方法的具体方法。
工厂方法:让产品创建由其子 classes 实现。
以上示例适用于两者。事实上,工厂方法的任何示例也适用于模板方法。
这么说也好
- 工厂方法模式是专门用于获取对象的模板方法模式,其实现依赖于用户代码,可以在子class[中提供对象创建的实现=42=]
- 如果用于对象创建的模板模式是工厂方法模式。
我的第二个疑问: 工厂方法(按照GOF的无规律性)是否必须从其他具体方法调用其抽象产品生产方法?
如果上面的答案是'No'那么这意味着会有一些消费者代码将有一个类型工厂(组合)的实例,将调用工厂方法来获取产品的对象并将注入混凝土工厂 class。但是现在这变成了抽象工厂。
我不想过度简化这些模式,但是,是的,两种抽象都完全推迟了实现细节。将客户端与实现细节解耦更加灵活,并允许每个客户端独立发展;这就是依赖倒置原则的本质。
- 工厂方法延迟创建完全
- 策略延迟行为完全
解决上面的评论:
- 模板方法延迟行为部分(不完全相同)
这些模式不是专门使用的,例如,策略可以使用模板方法、工厂方法或其他模式。
希望对您有所帮助!
工厂方法模式和模板方法模式的设计相似,但用途不同。
工厂方法是一种创建模式,其中 object 创建是 child class 的责任。
一种模式,其中 class 为 object 创建定义一个抽象方法,并使用创建的 object 定义另一个方法,从而允许子 class 提供创建方法的实现是工厂方法
模板方法是一种行为模式,其中行为由子程序负责 class。
一种模式,其中一个class为一个行为定义了一个抽象方法,另一个方法调用抽象方法来执行该行为,该行为由子class实现。因此,它的 parent class 调用 child class 的实现,而不对其子 class 有任何明确的编译时依赖性。工厂方法模式也是如此。但两者的意图不同。
换句话说,我们可以说工厂方法模式创建 object 类似于模板方法模式执行行为。