設計模式學習總結之抽象工廠模式

2021-08-01 21:17:06 字數 1904 閱讀 6304

1)產品等級結構:產品等級結構即產品的繼承結構,如乙個抽象類是電視機,其子類有海爾電視機,

海信電視機,tcl電視機 則抽象電視機與具體品牌的電視機之間構成了乙個產品等級結構,抽象電視

機是父類,而具體品牌的電視機是其子類

2)產品族:在抽象工廠模式中,產品族是指由同乙個工廠生產的,位於不同產品等級結構中的一組產

品,如海爾電器工廠生產的海爾電視機,海爾電冰箱,海爾電視機位於電視機的產品等級結構中,海

爾電冰箱位於電冰箱的產品等級結構中,海爾電視機,海爾電冰箱構成了乙個產品族。

抽象工廠模式為建立一組物件提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠

不只是建立一種產品,她負責建立一族產品

抽象工廠模式:提供乙個建立一系列相關或或相互依賴物件的介面,而無須指定他們具體的類。

抽象工廠模式又稱為kit模式,他是一種物件建立型模式。在抽象工廠模式中,每乙個具體工廠都

提供了多個工廠方法用於生產多種不同型別的產品,這些產品構成了乙個產品族

abstractfactory(抽象工廠):它宣告了一組用於建立一族產品的方法,每乙個方法對應一種產品。

concretefactory(具體工廠): 它實現了在抽象工廠方法中宣告的建立產品的方法,生成一組具體

產品,這些產品構成了乙個產品族,每乙個產品都位於某個產品等級結構中。

abstractproduct(抽象產品):它為每種產品宣告介面,在抽象產品中宣告了產品所具有的業務方法。

concreteproduct(具體產品): 它定義了具體工廠生產的具體產品物件,實現抽象產品介面中宣告的

業務方法。

1)隔離了具體類的生成,使得客戶並不需要知道什麼被建立。由於這種隔離,更換乙個具體工廠就

變得相對容易,所有的具體工廠都實現了抽象工廠中定義的那些公共介面,因此只需要改變具體工廠的實

例,就可以在某種程度上改變整個軟體系統的行為。

2)當乙個產品族中的多個物件被設計成一起工作時,它能夠保證客戶端始終只使用同乙個產品族中的物件。

3)增加新的產品族很方便,無須修改已有系統,符合開閉原則

增加新的產品等級結構麻煩,需要對現有系統進行較大的修改,甚至

需要修改抽象層的**,這顯然會帶來較大的不便,違背了開閉原則

當系統所提供的工廠生產的具體產品並不是乙個簡單的物件,而是多個位於不同產品等級結構,屬於

不同型別的具體產品時就可以使用抽象工廠模式。主要應用於以下場景:

1)系統中有多於乙個的產品族,而每次只使用其中的某一產品族。可以通過配置檔案等方式來使得使用者

可以動態改變產品族,也可以很方便地增加新的產品族。

2)屬於同乙個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。同乙個產品族中

的產品可以是沒有任何關係的物件,但是它們都具有一些共同的約束。

3)產品等級結構穩定,設計完成之後,不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構。

在抽象工廠模式中,增加新的產品族很方便,但是增加新的產品等級結構很麻煩,抽象工廠模式的

這種性質稱為"開閉原則"的傾斜性.開閉原則要求系統對擴充套件開放,對修改封閉,通過擴充套件達到增強

其功能的目的,對於涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:

1) 增加產品族:對於增加新的產品族,抽象工廠模式很好的支援了開閉原則,只需要增加具體的產

品並對應增加乙個新的具體工廠,對已有**無須做任何修改

2)增加新的產品等級結構:對於增加新的產品等級結構,需要修改所有的工廠角色,包括抽象工廠

類,在所有的工廠類中都需要增加生產新產品的方法違背了開閉原則

設計模式之抽象工廠模式學習

抽象工廠模式 提供了乙個建立一系列相關或相互依賴物件的介面,而無需指定它們的具體的類。它用於解決涉及多個產品系列的問題,包含所有產品的建立方法。abstractproducta和 abstractproductb 是兩個抽象的產品,之所以稱之為抽象就是因為它們可以有兩種不同的實現,productaa...

抽象工廠模式 設計模式3之抽象工廠模式

工廠方法模式中工廠只負責同類產品的生產。比如電視機工廠不應該生產汽車。然而現實生活中有很多綜合型的工廠,比如有些電視工廠不僅生產電視機,還會生產與之配套的機頂盒。那麼抽象工廠模式隨之誕生,這種模式將考慮多種型別產品的生產。我們總結下 工廠方法模式只考慮成產同一等級級的產品抽象方法模式考慮生產多等級的...

設計模式學習之抽象工廠

tbase為抽象 tconcreate為具體.template class cconcretefactory 抽象工廠 註冊自己的工廠由使用者自己完成 物件的釋放由建立者自己維護 template class cbasefactory cbasefactory cbasefactory const ...