工厂方法模式
概述
《设计模式》中对工厂方法模式的意图描述如下:
定义一个创建对象的接口,让子类来决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类
一般工厂方法模式的类结构图如下所示:
其中,每个组件的介绍如下:
Product
:产品实例对象的统一接口,及工厂方法创建的对象抽象ConcreateProduct
:实际的产品实例类Createtor
:声明工厂方法的组件,可以定义工厂方法的默认实现ConcreateCreator
:对Creator
工厂方法重定义的实际子类
具体实例
假设现在需要制作一个应用程序框架,这个框架需要能够向用户显示多种文档,为了能够灵活地支持文档的扩展,因此对于处理文档的类来讲,它无法得知它具体会处理的文档类型。一个可行的方案是定义带有参数的处理方法来区别处理,但是这种方式和硬编码的方式并没有什么不同
而工厂方法模式提供了合适的解决方案,因为处理类无法知道处理的具体文档,因此我们可以提取文档的共性作为处理类能够处理的抽象类,而对于处理类来讲,则可以通过继承的方式来定义实际需要处理的文档类型,极大地提高了系统的灵活性
定义 Application
用于处理相关的文档, Document
表示文档的抽象,具体如下:
public abstract class Application {
protected abstract Document createDocument();
// 省略相关的文档处理操作
}
public interface Document {
void open();
void close();
}
假设现在系统需要添加对于 Text
文档的处理类,那么我们可以定义对应的具体子类:
public class TextDocument implements Document {
// 省略具体的实现细节
}
public class TextApplication extends Application {
@Override
protected Document createDocument() {
return new TextDocument();
}
}
通过这种方式,现在 TextApplication
同样具备框架提供的文档处理操作
总结
使用工厂方法能够得到以下的一些优点:
- 结合模板方法模式,通过给子类提供钩子方法,提高了系统的可扩展性
- 工厂方法模式提高了高级抽象类之间的交互的可行性,使得对于特定应用的处理能够延伸到具体子类
和 “抽象工厂模式” 的联系:
- “抽象工厂模式” 作用与类层次级别,而 “工厂方法模式” 作用于方法级别,二者的作用点不同
- “抽象工厂模式” 中对于产品的生产,通常都是通过 “工厂方法模式” 来实现
参考:
[1] 《设计模式—可复用面向对象基础》