將實例生成交給子類的 Factory Method模式

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();
    }
}

拓展思路

生成實例的三種方法
  1. 指定其爲抽象方法
    子類必須使用該方法
  2. 爲其實現默認處理
    子類沒有實現該方法,認爲是默認處理
class Factory{
	public Product createProduct(String name) {
		return new Product(name);
	}
}
  1. 在其中拋出異常

相關的設計模式

Factory Method模式
  • Factory Method模式是Template Method 模式用於生成實例的一個典型例子。
Singleton模式
  • 大多數都可以用Singleton模式扮演Creator角色
Composite模式
  • 有時可將Composite模式用於Product角色
Iterator模式
  • 在Iterator模式中,有時使用iterator方法生成Iterator的實例會使用Factory Method模式。

滿足的原則

  • 依賴倒轉原則
  • 開放封閉原則
  • 里氏代換原則
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章