標籤:理解 概念 需要 運行 應用程式調用 使用情境 檔案 日誌 public
1、概念
Factory 方法模式是建立型模式,定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory 方法使一個類的執行個體化延遲到子類。
2、模式結構
- ILog:抽象產品,是具體產品繼承的父類或者是實現的介面。
- FileLog/DatabaseLog:具體產品,具體工廠角色所建立的對象就是此角色的執行個體。
- ILogFactory:抽象工廠,是具體工廠角色必須實現的介面或者必須繼承的父類。
- FileLogFactory/DatabaseLogFactory:具體工廠,它含有和具體商務邏輯有關的代碼。由應用程式調用以建立對應的具體產品的對象。
3、使用情境
- 一個類不知道它所需要的對象的類,在Factory 方法模式中,用戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可
- 一個類通過其子類來指定建立哪個對象,在Factory 方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的對象,利用物件導向的多態性和裡氏代換原則,在程式運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴充
- 將建立對象的任務委託給多個工廠子類中的某一個,用戶端在使用時可以無須關心是哪一個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在設定檔或資料庫中
4、優缺點
優點:
- 設計上負符合開閉原則,新增產品時,只需要增加相應的產品類和工廠類即可
- 只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名
- 多態性設計是Factory 方法模式的關鍵,它能夠使工廠可以自主確定建立何種產品對象,而如何建立這個對象的細節則完全封裝在具體工廠內部
缺點:
- 添加新產品時,除了增加新產品類外,還要提供與之對應的具體工廠類,系統類別的個數將成對增加,在一定程度上增加了系統的複雜度
- 由於考慮到系統的可擴充性,需要引入抽象層,在用戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度
- 保證了Factory 方法內的對修改關閉,但對於使用Factory 方法的類,如果要更換另外一種產品,仍然需要修改執行個體化的具體工廠類
5、執行個體
在系統日誌設計中,可能需要考慮多種日誌系統,例如檔案和資料庫日誌系統,現使用Factory 方法模式設計該系統。
首先,先建立抽象日誌類ILog。
public interface ILog { void writeLog(LogType type);}
其次,建立具體日誌類FileLog和DatabaseLog
public class FileLog implements ILog { @Override public void writeLog(LogType type) { // 檔案日誌邏輯 }}
public class DatabaseLog implements ILog { @Override public void writeLog(LogType type) { // 資料庫日誌邏輯 }}
再次建立抽象日誌工廠類ILogFactory
public interface ILogFactory { ILog createLog();}
最後建立具體工廠類FileLogFactory和DatabaseLogFactory
public class FileLogFactory implements ILogFactory { @Override public ILog createLog() { return new FileLog(); }}
public class DatabaseLogFactory implements ILogFactory { @Override public ILog createLog() { return new DatabaseLog(); }}
使用姿勢
public static void main(String[] args) { ILogFactory factory = new FileLogFactory(); // 換資料庫日誌,改這裡即可 ILog log = factory.createLog(); log.writeLog(LogType.Debug);}
Factory 方法模式