工廠三兄弟之工廠方法模式(一)
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——工廠方法模式。
1 日誌記錄器的設計
Sunny軟體公司欲開發一個系統執行日誌記錄器(Logger),該記錄器可以通過多種途徑儲存系統的執行日誌,如通過檔案記錄或資料庫記錄,使用者可以通過修改配置檔案靈活地更換日誌記錄方式。在設計各類日誌記錄器時,Sunny公司的開發人員發現需要對日誌記錄器進行一些初始化工作,初始化引數的設定過程較為複雜,而且某些引數的設定有嚴格的先後次序,否則可能會發生記錄失敗。如何封裝記錄器的初始化過程並保證多種記錄器切換的靈活性是Sunny公司開發人員面臨的一個難題。 |
Sunny公司的開發人員通過對該需求進行分析,發現該日誌記錄器有兩個設計要點:
(1) 需要封裝日誌記錄器的初始化過程,這些初始化工作較為複雜,例如需要初始化其他相關的類,還有可能需要讀取配置檔案(例如連線資料庫或建立檔案),導致程式碼較長,如果將它們都寫在建構函式中,會導致建構函式龐大,不利於程式碼的修改和維護;
(2) 使用者可能需要更換日誌記錄方式,在客戶端程式碼中需要提供一種靈活的方式來選擇日誌記錄器,儘量在不修改原始碼的基礎上更換或者增加日誌記錄方式。
Sunny公司開發人員最初使用簡單工廠模式對日誌記錄器進行了設計,初始結構如圖1所示:
圖1 基於簡單工廠模式設計的日誌記錄器結構圖
在圖1中,LoggerFactory充當建立日誌記錄器的工廠,提供了工廠方法createLogger()用於建立日誌記錄器,Logger是抽象日誌記錄器介面,其子類為具體日誌記錄器。其中,工廠類LoggerFactory程式碼片段如下所示:
//日誌記錄器工廠
class LoggerFactory {
//靜態工廠方法
public static Logger createLogger(String args) {
if(args.equalsIgnoreCase("db")) {
//連線資料庫,程式碼省略
//建立資料庫日誌記錄器物件
Logger logger = new DatabaseLogger();
//初始化資料庫日誌記錄器,程式碼省略
return logger;
}
else if(args.equalsIgnoreCase("file")) {
//建立日誌檔案
//建立檔案日誌記錄器物件
Logger logger = new FileLogger();
//初始化檔案日誌記錄器,程式碼省略
return logger;
}
else {
return null;
}
}
}
為了突出設計重點,我們對上述程式碼進行了簡化,省略了具體日誌記錄器類的初始化程式碼。在LoggerFactory類中提供了靜態工廠方法createLogger(),用於根據所傳入的引數建立各種不同型別的日誌記錄器。通過使用簡單工廠模式,我們將日誌記錄器物件的建立和使用分離,客戶端只需使用由工廠類建立的日誌記錄器物件即可,無須關心物件的建立過程,但是我們發現,雖然簡單工廠模式實現了物件的建立和使用分離,但是仍然存在如下兩個問題:
(1) 工廠類過於龐大,包含了大量的if…else…程式碼,導致維護和測試難度增大;
(2) 系統擴充套件不靈活,如果增加新型別的日誌記錄器,必須修改靜態工廠方法的業務邏輯,違反了“開閉原則”。
如何解決這兩個問題,提供一種簡單工廠模式的改進方案?這就是本文所介紹的工廠方法模式的動機之一。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 工廠三兄弟之抽象工廠模式(一)抽象模式
- 工廠三兄弟之簡單工廠模式(一)模式
- 工廠三兄弟之簡單工廠模式(三)模式
- 工廠三兄弟之抽象工廠模式(二)抽象模式
- 工廠三兄弟之簡單工廠模式(二)模式
- 設計模式-建立型模式-工廠模式(工廠三兄弟) TypeScript設計模式TypeScript
- 設計模式 - 工廠三兄弟設計模式
- 一篇搞定工廠模式【簡單工廠、工廠方法模式、抽象工廠模式】模式抽象
- 設計模式系列之工廠模式三兄弟(Factory Pattern)設計模式
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 建立型:工廠模式-工廠方法、抽象工廠模式抽象
- 工廠模式之簡單工廠模式模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- Java設計模式之簡單工廠、工廠方法和抽象工廠Java設計模式抽象
- 簡單工廠、工廠方法和抽象工廠模式抽象模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 設計模式-工廠模式二(工廠方法模式)設計模式
- 簡單工廠和工廠方法模式模式
- 抽象工廠模式-與-工廠方法模式區別抽象模式
- 工廠方法模式模式
- 設計模式之工廠模式(三)設計模式
- 工廠方法模式GoF23種設計模式之建立型模式之工廠方法模式Go設計模式
- 簡單工廠模式、工廠方法模式和抽象工廠模式有何區別?模式抽象
- 設計模式之工廠方法模式設計模式
- 設計模式之工廠方法設計模式
- 設計模式學習筆記(三)簡單工廠、工廠方法和抽象工廠之間的區別設計模式筆記抽象
- 工廠方法模式與抽象工廠模式的區別模式抽象
- 簡單工廠模式、工廠模式、抽象工廠模式比較模式抽象
- 簡單工廠模式—>工廠模式模式
- 設計模式(三)抽象工廠方法模式設計模式抽象
- 工廠方法模式(FactoryMethod)模式
- 設計模式之工廠模式(一)設計模式
- Java設計模式之工廠方法模式Java設計模式
- golang設計模式之工廠方法模式Golang設計模式
- 設計模式系列之「工廠方法模式」設計模式
- PHP之工廠模式PHP模式
- GoF之工廠模式Go模式