Factory Method模式
在Factory Method模式中,父類決定實例的生成方式,但並不決定索要生成的具體類,具體的處理全部交給子類負責。這樣就可以將生成的實例框架和實際負責生成實例的類解耦。
示例程序
首先,我們來看一段Factory Method模式的實例程序。這段示例程序的作用是製作身份證(ID卡),他其中有5個類。
Product類和Factory類屬於framework包。這兩個類組成了生成實例的框架、
IDCard類和IDCardFactory;類負責實際的加工處理,他們屬於idcard包。
Main類用於測試程序行爲的類、
在閱讀程序時,注意所閱讀的代碼屬於framework包還是idcard包。
- 生成實例的框架(framework包)
- 加工處理idcard包
package framework;
//用來表示產品的類。
//在該類中僅聲明瞭抽象方法use。具體實現交給子類
public abstract class Product {
public abstract void use();
}
package framework;
/**
* 在Factory類中,我們使用了Template Method模式。
* 該類還聲明瞭用於“生成產品”的createProduct抽象方法和用於“註冊產品”的
* registerProduct抽象方法。這兩個方法的具體實現則交給Factory類的子類負責。
*
* 在這個框架中,我們定義了工廠是用來“調用create方法,生成Product實例”的。而
* create方法的實現實現調用createProduct生成產品。接着調用registerProduct
* 註冊產品。
*
* 具體的實現內容根據Factory Method模式適用的場景不同而不同。但是,只要Factory Method模式,
* 在生成實例時就會用到Template Method模式。
* **/
public abstract class Factory {
public final Product create(String owner) {
Product p=createProduct(owner);
registerProduct(p);
return p;
}
protected abstract void registerProduct(Product p);
protected abstract Product createProduct(String owner);
}
package idcard;
import framework.*;
public class IDCard extends Product {
private String owner;
IDCard(String owner){
System.out.println("製作"+owner+"的ID卡");
this.owner=owner;
}
@Override
public void use() {
System.out.println("使用"+owner+"的ID卡");
}
public String getOwner() {
return owner;
}
}
package idcard;
import framework.*;
import java.util.*;
/**
* IDCardFactory類實現了createProduct犯法和registerProduct方法。
* createProduct方法通過生成IDCard的實例來生成產品。
* registerProduct方法則通過將IDCard的owner保存到owners字段中來實現“註冊產品”
* **/
public class IDCardFactory extends Factory{
private List owners= new ArrayList<String>();
@Override
protected void registerProduct(Product p) {
owners.add(p);
}
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
public List getOwners() {
return owners;
}
}
import framework.*;
import idcard.*;
public class Main {
public static void main(String[] args) {
Factory factory=new IDCardFactory();
Product card1=factory.create("曉明");
Product card2=factory.create("小紅");
Product card3=factory.create("小剛");
card1.use();
card2.use();
card3.use();
}
}
Factory Method模式中的登場角色
Product(產品)
Product角色屬於框架這一方面,是一個抽象類。他定義了在Factory Method,模式中生成的那些實例所持有的接口,但具體的處理則由子類ConcreteProduct角色決定。在示例程序彙總,由Product類扮演此角色。
Creator(創建者)
Creator角色屬於框架這一方,它是負責生成Product角色的抽象類,但具體的處理由子類ConcreteCreator角色決定。在示例程序中,由Factory類扮演次角色。
Creator角色對於示例負責生成實例的ConcreteCreator角色一無所知。它位移知道的就是,只要調用Product角色和生成實例的方法,就可以生成Product實例、在示例程序中,createProduct方法是用於生成實例的方法。不用new關鍵字來生成實例,而是調用生成實例的專用方法來生成實例,這樣就可以放置防止與其他具體類耦合。
ConcreteProduct(具體的產品)
ConcreteProduct角色屬於具體家棟這一方,它決定了具體的產品。在示例程序中,由IDCard類扮演此角色。
ConcreteCreator(具體的創建者)
ConcreteCreator角色屬於具體加工這一方,它負責生成具體的產品。在示例程序中,由IDCardFactory類扮演此角色。