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();
}
}
運行截圖如下所示:
參考文獻:
- 圖解設計模式 - 結成浩著、楊文軒譯 - 人民郵電出版社