1.1概述 提供一個創建一系列或相互依賴對象的介面,而無須指定他們具體的類。這就是抽象工廠模式的定義。 設計某些系統時可能需要為用戶提供一系列相關的對象,但系統不希望用戶直接使用new運算符實例化這些對象,而是應當由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類來創建這些對象,而且還必 ...
1.1概述
提供一個創建一系列或相互依賴對象的介面,而無須指定他們具體的類。這就是抽象工廠模式的定義。
設計某些系統時可能需要為用戶提供一系列相關的對象,但系統不希望用戶直接使用new運算符實例化這些對象,而是應當由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類來創建這些對象,而且還必須要清楚對象之間是如何關聯的,使得用戶的代碼和這些類形成緊耦合、缺乏彈性、不利於維護。
例如,軍隊要為士兵(用戶)提供機關槍、手槍以及相應的子彈,但軍隊系統不希望由士兵提供來生產機關槍、手槍以及子彈,而是由相應的工廠專門負責配套生產,即有一個專門負責生產機關槍、手槍、子彈的工廠。具體關係如下圖一所示:
圖一:兵工廠與槍械、子彈關係示意圖(PS:僅僅作為示意圖,不要糾結喲)
當系統準備為用戶提供一系列相關的對象,又不想讓用戶代碼和創建這些對象的類形成耦合時,就可以使用抽象工廠方法模式來設計系統。抽象工廠模式的關鍵是在一個抽象類或介面中定義若幹個抽象方法,這些抽象方法分別返回某個類的實例,該抽象類或介面讓其子類或實現該介面的類重寫這些抽象方法為用戶提供一系列相關的對象。
1.2模式的結構
抽象工廠模式的結構中包括四種角色:
(1)抽象產品(Product):一個抽象類或介面,負責定義具體產品必須實現的方法;
(2)具體產品(ConcreteProduct):具體產品是一個類,如果Product是一個抽象類,那麼具體產品就是實現Product的子類;如果Product是一個介面,那麼具體產品就是實現Product介面的類;
(3)抽象工廠(AbstractFactory):一個介面或抽象類,負責定義若幹個抽象方法;
(4)具體工廠(ConcreteFactory):如果抽象工廠是抽象類,具體工廠就是抽象工廠的子類;如果抽象工廠是一個介面,那麼具體工廠就是實現抽象工廠介面的類。具體工廠重寫抽象工廠中的抽象方法是該方法返回具體產品的實例。
抽象工廠模式的類圖如下圖二所示:
圖二:抽象工廠模式結構類圖
1.3抽象工廠模式的優點
(1)抽象工廠可以為用戶創建一系列相關的對象,使用戶和創建這些對象的類脫耦。
(2)使用抽象工廠模式可以方便為用戶創建一系列對象。用戶使用不同的具體工廠就能得到一組相關的對象,同時也能避免用戶混用不用系列中對象。
(3)在抽象工廠模式中,可以隨時增加“具體工廠”為用戶提供一組相關的對象。
1.4適合使用抽象工廠模式的情景
(1)系統需要為用戶提供多個對象,但不希望用戶直接用new運算符實例化這些對象,即希望用戶和創建對象脫耦。
(2)系統需要為用戶提供一系列對象,但只需要知道這些對象有哪些方法可用,不需要用戶知道這些對象的創建過程。