目錄
抽象工廠模式
在工廠方法模式中每一個具體工廠都只需要生產一種具體產品,但是在抽象工廠模式中一個具體工廠可以生產一組相關的具體產品,這樣一組產品成爲產品族,產品族中的每一個產品都屬於某一個產品繼承等級結構.
產品等級與產品族
工廠方法模式通過引入工廠等級結構解決了簡單工廠模式中工廠類職責太重的問題,但是由於工廠模式中的每個具體工廠都只有一個或者一組重載的工廠方法,只能生存一種產品,可能會導致系統中存在大量的工廠類,有時候可能需要一個工廠可以提供多種產品對象,而不是單一的產品對象.
爲了理解抽象工廠模式,引入兩個概念:
- 產品等級結構:產品等級結構即產品的繼承結構.
- 產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的位於不同產品等級結構中的一組產品.
只要指明一個產品所處的產品族以及它所屬的等級結構就可以唯一確定這個產品.
抽象工廠模式概述
當系統所提供的工廠生產的具體產品並不是一個簡單的對象,而是多個位於不同產品等級結構,屬於不同類型的具體產品時就可以使用抽象工廠模式.
工廠方法模式針對的是一個產品等級機構,而抽象工廠模式需要面對多個產品等級結構.
抽象工廠模式爲創建一組對象提供了一種解決方案.與工廠方法模式相比,抽象工廠模式中的具體工廠不是隻創建一種產品,它負責創建一族產品.
抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類.
抽象工廠模式結構
抽象工廠模式包含4個角色:
- 抽象工廠
- 具體工廠
- 抽象產品
- 具體產品
抽象工廠模式實現
抽象工廠可以是接口,也可以是抽象類或者具體類:
public interface AbstractFactory{
public AbstractProductA createProductA(); //工廠方法一
public AbstractProductB createProductB(); //工廠方法二
...
}
具體工廠實現了抽象工廠,每一個具體的工廠方法可以返回一個特定的產品對象,而同一個具體工廠所創建的產品對象構成了一個產品族.
public class ConcreteFactory1 implements AbstractFactory{
//工廠方法一
public AbstractProductA createProductA(){
return new ConcreteProductA1();
}
//工廠方法二
public AbstractProductB createProductB(){
return new ConcreteProductB1();
}
...
}
開閉原則的傾斜性
在抽象工廠模式中增加新的產品族很方便,但是增加新的產品等級結構很麻煩,抽象工廠模式的這種性質稱爲開閉原則的傾斜性.
- 增加產品族時,抽象工廠模式很好地支持了開閉原則,只需要增加具體產品並對應增加一個新的具體工廠,對已有代碼無須做任何修改.
- 增加新的產品等級結構時,需要修改所有的工廠角色,包括抽象工廠類,違背了開閉原則.
因此,要求設計人員在設計之初就能夠考慮全面,不會在設計完成之後再向系統中增加新的產品等級結構,也不會刪除已有的產品等級結構,否則將會導致系統出現較大的修改,爲後續維護工作帶來諸多麻煩.
抽象工廠模式優/缺點與適用環境
Java語言中的AWT(抽象窗口工具包)中就使用了抽象工廠模式.
抽象工廠模式的優點:
- 抽象工廠模式隔離了具體類的生成,使得客戶端並不需要知道什麼被創建.更換一個具體工廠就變得相對容易.
- 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象.
- 增加新的產品族很方便,無須修改已有系統,符合開閉原則.
抽象工廠模式的缺點:
- 增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了開閉原則.
抽象工廠模式適用環境:
- 一個系統不應當依賴於產品類實例如何被創建,組合和表達的細節,這對於所有類型的工廠模式都是很重要的,用戶無須關心對象的創建過程,將對象的創建和使用解耦.
- 系統中有多於一個的產品族,而每次只使用某一產品族,可以通過配置文件等方式來使用戶能夠動態改變產品族,也可以很方便地增加新的產品族.
- 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來.
- 產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構.
小結
- 在抽象工廠模式中,產品等級結構即產品的繼承結構,產品族是指由同一個工廠生產的位於不同產品等級結構中的一組產品.
- 抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類.抽象工廠模式是一種對象創建型模式.
- 抽象工廠模式包含抽象工廠,具體工廠,抽象產品和具體產品4個角色.其中,抽象工廠聲明瞭一組用於創建一族產品的方法,每一個方法對應一種產品;具體工廠實現了在抽象工廠中聲明的創建產品的方法,生成一組具體產品,這些產品構成了一個產品族,每一個產品都位於某個產品等級結構中;抽象產品爲每種產品聲明接口,在抽象產品中聲明瞭產品所具有的業務方法;具體產品定義具體工廠生產的具體產品對象,實現抽象產品接口中聲明的業務方法.
- 抽象工廠模式的優點主要是隔離了具體類的生成,使得客戶端並不需要知道什麼被創建;當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象;增加新的產品族很方便,無須修改已有系統,符合開閉原則.其缺點主要是增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了開閉原則.
- 抽象工廠模式適用於以下環境:一個系統不應當依賴於產品類實例如何被創建,組合和表達的細節;系統中有多於一個的產品族,而每次只使用某一產品族;屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來;產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構.
- 抽象工廠模式以一種傾斜的方式來滿足開閉原則.對於增加新的產品族,抽象工廠模式很好地支持了開閉原則;對於增加新的產品等級結構,需要修改所有的工廠角色,違背了開閉原則.