Factory 方法模式

來源:互聯網
上載者:User

標籤:理解   概念   需要   運行   應用程式調用   使用情境   檔案   日誌   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 方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.