說明:由于本人是一個初學者,是以部落格中用到的一些見解、圖檔、代碼或者說明可能引用網絡上面的資源,如果涉及到了侵權的問題請大家聯系我進行删除。
這一篇部落客要記錄了Abstract Factory(抽象工廠)模式的學習,Abstract Factory模式和之前的Factory Method模式非常相似,都是用于繞開new來進行對象建立,隻有些許不同。
動機
在軟體系統中,經常面臨着“一系列互相依賴的對象”的建立工作;同時,由于需求的變化,往往存在着更多系列對象的建立工作。
如何應對這種變化?如何繞開正常的對象建立方法(new),提供一種“封裝機制”來避免客戶程式和這種“多系列具體對象建立工作”的緊耦合?
模式定義
提供一個接口,讓該接口負責建立一系列“相關或者互相依賴的對象”,無需指定它們具體的類。
舉例
抽象工廠模式的結構圖如下所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csgXVE90dFRVT6FleYhnRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukjM1MjN1kTM0ADMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在工廠方法模式裡面我們舉了一個關于單純的畜牧場的例子。這裡我們進行一下擴充,進行一個農場的建構:
分析:農場中除了像畜牧場一樣可以養動物,還可以培養植物,如養馬、養牛、種菜、種水果等,是以本執行個體比前面介紹的畜牧場類複雜,必須用抽象工廠模式來實作。
本例用抽象工廠模式來設計兩個農場,一個是韶關農場用于養牛和種菜,一個是上饒農場用于養馬和種水果,可以在以上兩個農場中定義一個生成動物的方法 newAnimal() 和一個培養植物的方法 newPlant()。
本例的結構圖如下所示:
要點總結
如果沒有應對“多系列對象建構”的需求變化,則沒有必要使用Abstract Factory模式,這時候使用簡單的工廠完全可以。
“系列對象”指的是在某一特定系列下的對象之間有互相依賴、或作用的關系。不同系列的對象之間不能互相依賴。
Abstract Factory模式主要在于應對“新系列”的需求波動。其缺點在于難以應對“新對象”的需求變動。
ps: 抽象工廠的核心或者說與普通的工廠方法的差別主要在于系列對象。其實工廠方法模式可以看作是抽象工廠模式的一個特例(工廠方法模式建立一個對象而抽象工廠模式建立一系列對象)。