模式定义
Factory Method工厂方法模式定义了个一个用于创建一系列对象的抽像接口,让它的每一个子类来决定具体实例化哪个类。它使得一个类的实例化延迟到了子类中实现。
使用范围
- 当某个类不知道它所创建的类属于何种对象的时候
- 当某个类希望由它的子类来指定它所创建的对象的时候
使用方法
先看一个类结构图:
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();
}
}
以上是工厂方法的实现代码样例,从它的类结构图我们可以看出工厂-产品之间的实现方式。
运行代码如下:
public class Client {
public static void main(String args[]) {
Application app = new MyApplication();
app.createObjects();
app.cleanDump();
app = new YourApplication();
app.createObjects();
app.cleanDump();
}
}
下载示例
本文介绍了工厂方法模式的概念、使用场景及实现方式,并通过一个具体的Java示例详细展示了如何利用此模式来实现对象的创建过程。
1275

被折叠的 条评论
为什么被折叠?



