模式定义
Factory Method工厂方法模式定义了个一个用于创建一系列对象的抽像接口,让它的每一个子类来决定具体实例化哪个类。它使得一个类的实例化延迟到了子类中实现。
使用范围
- 当某个类不知道它所创建的类属于何种对象的时候
- 当某个类希望由它的子类来指定它所创建的对象的时候
使用方法
先看一个类结构图:
![](http://www.zigzagsoft.net/main/designpattern_image/factorymethod.jpg)
Product是一个产品类,包含了多个需要实例化的子类,比如ConcreteProduct。Creator是一个工厂,专门用来生产Product,它包含了一个抽像方法FactoryMethod(),该方法被下面的子类工厂继承并产生一个具体的Product类实例。也就是说要生产某个类型的Product,必须通过Concrete的Factory的FactoryMethod()方法来生成。
举例说明
假设我们有个Document类,用来产生一个文档,文档的方法分别init(), show()和dump()。我们可以定义该类为abstract。
public class Document { void init(){}; void show(){}; void dump(){}; }
生产Document的工厂类为Application,注意它引用了一个Document的类变量。在该工厂类中定义了几个抽像方法:createDocument()和cleanDump()。
public abstract class Application { protected Document doc; public abstract void createDocument(); public abstract void cleanDump(); public void createObjects() { //... createDocument(); } }
Document的两个子类
public class MyDocument extends Document { void init() { System.out.println("Init MyDocument"); } void show() { System.out.println("Show MyDocument"); } void dump() { System.out.println("Exit MyDocument"); } }
.
public class YourDocument extends Document { void init() { System.out.println("Init YourDocument"); } void show() { System.out.println("Show YourDocument"); } void dump() { System.out.println("Exit YourDocument"); } }
继承工厂Application的2个子类,分别实现了抽像方法。注意每个createDocument()实例化的分别是MyDocument和YourDocument类,这是关键所在。
public class MyApplication extends Application { public MyApplication() { // } public void createDocument() { doc = new MyDocument(); doc.init(); doc.show(); } public void cleanDump() { doc.dump(); } }
.
public class YourApplication extends Application { public YourApplication() { // } public void createDocument() { doc = new YourDocument(); doc.init(); doc.show(); } public void cleanDump() { doc.dump(); } }
以上是工厂方法的实现代码样例,从它的类结构图我们可以看出工厂-产品之间的实现方式。
![](http://www.zigzagsoft.net/main/designpattern_image/factorymethod-application.jpg)
运行代码如下:
public class Client { public static void main(String args[]) { Application app = new MyApplication(); app.createObjects(); app.cleanDump(); app = new YourApplication(); app.createObjects(); app.cleanDump(); } }
下载示例