java - 工厂方法模式是模板方法模式的特例吗?
问题描述
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
}
现在使用上面的用户代码将继承 Application 并为createContentView()
.
模板方法基本特征:父类具体方法调用其抽象方法。
工厂方法:让产品创建由其子类实现。
上面的例子适合两者。事实上,工厂方法的任何示例也适用于模板方法。
所以说得好
- 工厂方法模式是一种专门的模板方法模式,用于获取其实现依赖于用户代码的对象,可以在子类中提供对象创建的实现
- 如果用于对象创建的模板模式是工厂方法模式。
我的第二个疑问:Factory方法(根据基于inberitence的GOF)是否必须从其他具体方法调用其抽象产品生产方法?
如果上面的答案是“否”,那么这意味着会有一些消费者代码将具有工厂类型的实例(组合),将调用工厂方法来获取产品的对象,并将注入具体的工厂类。但是现在这变成了抽象工厂。
解决方案
我不想过分简化这些模式,但是,是的,这两种抽象都完全推迟了实现细节。将客户端与实现细节解耦更加灵活,并允许每个客户端独立发展;这就是依赖倒置原则的本质。
- 工厂方法完全推迟创建
- 策略完全推迟行为
要解决上述评论:
- 模板方法部分延迟行为(不完全相同)
这些模式不是专门使用的,例如,策略可以使用模板方法、工厂方法或其他模式。
我希望这有帮助!
推荐阅读
- mongodb - 是否可以在 MongoDB Compass 的集合中为每个文档添加一个字段?
- c - 与 tls 服务器和letsencrypt的ssl连接
- ios - 如何将图像、pdf、音频、视频和任何文件系统从 iphone 本地内存上传到服务器(API)
- java - 访问作为上限的通用集合的元素类型
- python - 有没有办法从 python 的循环中注册一个类的多个实例?
- python - 在神经网络中找到最佳学习率和时期
- node.js - react-admin 中每个操作的多个 API 命中问题
- excel - 循环遍历 VBA 中的值数组
- ios - 通过 REST API 将 NSAttributedString 发布到服务器
- random - 大多数伪随机数生成器会产生唯一数字的循环序列吗?