模式定义
定义一个创建对象的的接口,然后不同类型的对象提供该接口不同的实现,对象的具体实现交给接口的具体实现类去完成。
模式示例
下面以我们常见的文档处理为例,来说明工厂方法模式。
- 定义文档接口:文档支持打开操作和关闭操作。
- 创建文档:我们要创建两种类型文档,pdf格式文档和txt格式文档
- 定义一个工厂接口,提供一个创建文档的方法。
- 提供pdf文档和txt文档的工厂接口实现。
- 定义Client来检验模式的运行结果。
具体代码
文档接口的定义:支持打开和关闭操作
1 | public interface Document { |
文档类的定义:PdfDocument.java
和TxtDocument.java
1 | public class PdfDocument implements Document { |
1 | public class TxtDocument implements Document { |
定义工厂类:DocumentFactory.java
1 | public abstract class DocumentFactory { |
定义工厂类子类,分别来创建两种类型的文档:PdfFactory.java
和TxtFactory.java
1 | public class PdfFactory extends DocumentFactory { |
1 | public class TxtFactory extends DocumentFactory { |
定义Client来检验模式运行的结果:FactoryClient.java
1 | public class FactoryClient { |
模式总结
在总结之前,先来看看简单工厂模式的实现方式
- 定义文档接口:文档支持打开操作和关闭操作。
- 创建文档:我们要创建两种类型文档,pdf格式文档和txt格式文档
- 定义简单工厂类,根据要创建的文档类型穿件不同文档
SimpleDocumentFactory.java
1 | public class SimpleDocumentFactory { |
可以看到,与简单工厂模式相比,工厂方法模式不需要关心具体怎么创建对象的逻辑,但工厂方法模式多了许多的工厂实现类,即:
- 工厂方法模式解决了简单工厂模式中创建逻辑都在工厂类的问题(即新增文档类型不需要直接更改工厂类),但针对每一个新的文档类型,都要创建一个与之对应的工厂类,增加了类的个数。
- 简单工厂模式违背了开放封闭原则,新增产品(文档)是需要修改工厂类,而工厂方法模式解决了这个问题,它不需要修改工厂方法,只需要添加产品(文档)和产品对应的工厂即可。
- 工厂方法模式对外屏蔽了对象的创建操作,只需要执行相应工厂的创建方法即可得到对象。