文章目錄
Factory Method模式
應用場景
- 如果一個類需要創建某個接口的對象,但是又不知道具體的實現,這種情況可以選用工廠方法模式,把創建對象的工作延遲到子類中實現
- 如果一個類本身就希望由它的子類來創建所需的對象的時候,應該使用工廠方法模式
本質
- 延遲到子類來選擇實現。
優點
- 當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有廠對象不需要進行任何修改,也不需要(儘量小的)修改客戶端,較好的符合了 “開放一封閉”原則。
- 而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性不好。
缺點
- 具體產品對象與工廠方法的耦合性
工廠方法是要創建產品對象的,也就是需要選擇具體的產品對象,並創建他們的實例。
因此具體產品對象與工廠方法是耦合的。
角色
-
Product:
定義了生成實例所持有的API。 -
Creator:
不用new關鍵字來生成實例,而是調用生成實例的專有方法,可防止父類和其他具體類耦合。 -
ConcreteProduct:
重寫方法,決定了具體產品 -
ConcreteCreator:
負責生成具體的產品
Factory Method模式的類圖
示例程序
示例程序的類圖
示例代碼
package framework;
public abstract class Product {
public abstract void use();
}
package 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);
}
package idcard;
import framework.*;
public class IDCard extends Product {
private String owner;
IDCard(String owner) {
System.out.println("製作" + owner + "的ID卡。");
this.owner = owner;
}
public void use() {
System.out.println("使用" + owner + "的ID卡。");
}
public String getOwner() {
return owner;
}
}
package idcard;
import framework.*;
import java.util.*;
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
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();
}
}
拓展思路
生成實例的三種方法
- 指定其爲抽象方法
子類必須使用該方法 - 爲其實現默認處理
子類沒有實現該方法,認爲是默認處理
class Factory{
public Product createProduct(String name) {
return new Product(name);
}
}
- 在其中拋出異常
相關的設計模式
Factory Method模式
- Factory Method模式是Template Method 模式用於生成實例的一個典型例子。
Singleton模式
- 大多數都可以用Singleton模式扮演Creator角色
Composite模式
- 有時可將Composite模式用於Product角色
Iterator模式
- 在Iterator模式中,有時使用iterator方法生成Iterator的實例會使用Factory Method模式。
滿足的原則
- 依賴倒轉原則
- 開放封閉原則
- 里氏代換原則