1. 概述
用Template Method设计模式来构建生成实例的工厂就是工厂方法(Factory Method)设计模式。
在工厂方法(Factory Method)设计模式,父类决定实例的生成方式,但不决定要生成的具体的类,具体的处理全部交给子类负责,这样就可以将生成实例的框架(framework)和负责生成实例的类解耦。
2. 代码实现
首先要创建两个包,一个framework包,framework包中有工厂类、物品类,这两个类组成了生成实例的框架。
一个具体包,里面一个具体物品工厂类、具体物品类。
这里用铅笔来作为具体物品。
工厂类 Factory.java ,create() 方法生成实例,具体的处理由createProduct(String owner)、registerProduct(Product product)这两个方法,这两个方法由子类负责:
package factoryMethod.framework;
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
物品类,Product.java :
package factoryMethod.framework;
public abstract class Product {
public abstract void use();
}
具体物品工厂类PencilFactory.java,继承Factory.java:
package factoryMethod.pencil;
import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
import java.util.ArrayList;
import java.util.List;
public class PencilFactory extends Factory {
private List owners = new ArrayList();
@Override
protected Pencil createProduct(String owner) {
return new Pencil(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((Pencil)product).getOwner());
}
}
具体物品类,Pencil.java:
package factoryMethod.pencil;
import factoryMethod.framework.Product;
public class Pencil extends Product {
private String owner;
Pencil(String owner) {
System.out.println("制作" + owner + "的pencil");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用" + owner + "的pencil");
}
public String getOwner() {
return owner;
}
}
测试类,test.java :
package factoryMethod;
import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
import factoryMethod.pencil.PencilFactory;
public class test {
public static void main(String args[]) {
Factory factory = new PencilFactory();
Product p1 = factory.create("aaa");
Product p2 = factory.create("bbb");
Product p3 = factory.create("ccc");
p1.use();
p2.use();
p3.use();
}
}
运行截图如下所示:
参考文献:
- 图解设计模式 - 结成浩著、杨文轩译 - 人民邮电出版社