設計模式之抽象工廠模式 C 實現

2021-10-12 21:59:09 字數 4113 閱讀 8222

更多設計模式參看: 設計模式之模式概述(模式彙總)(c++實現)

優點:缺點:模式結構

**示例

工廠方法模式中考慮的是一類產品的生產,如畜牧場只養動物、電視機廠只生產電視機、計算機軟體學院只培養計算機軟體專業的學生等。乙個工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。此時,我們可以考慮將一些相關的產品組成乙個「產品族」,由同乙個工廠來統一生產,如乙個電器工廠,它可以生產電視機、電冰箱、空調等多種電器,而不是只生產某一種電器。

引入兩個概念:

(1)產品等級結構:產品等級結構即產品的繼承結構,如乙個抽象類是電視機,其子類有海爾電視機、海信電視機、tcl電視機,則抽象電視機與具體品牌的電視機之間構成了乙個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。

(2)產品族:在抽象工廠模式中,產品族是指由同乙個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中,海爾電視機、海爾電冰箱構成了乙個產品族。

抽象工廠模式(abstract factory pattern):提供乙個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類。抽象工廠模式又稱為kit模式,它是一種物件建立型模式。抽象工廠模式中的具體工廠不只是建立一種產品,它負責建立一族產品。

主要解決介面選擇的問題。

抽象工廠模式為建立一組物件提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是建立一種產品,它負責建立一族產品。

在以下情況下可以考慮使用抽象工廠模式:

(1) 乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,使用者無須關心物件的建立過程,將物件的建立和使用解耦。

(2) 系統中有多於乙個的產品族,而每次只使用其中某一產品族。

(3) 屬於同乙個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。同乙個產品族中的產品可以是沒有任何關係的物件,但是它們都具有一些共同的約束。

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

比如如海爾電器工廠既生產海爾電視機也生產海爾電冰箱

qq 換**,一整套一起換

抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被建立,這使得更換乙個具體工廠就變得相對容易

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

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

增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層**,這顯然會帶來較大的不便,違背了「開閉原則」。

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

具體工廠(concretefactory):它實現了在抽象工廠中宣告的建立產品的方法,生成一組具體產品,這些產品構成了乙個產品族,每乙個產品都位於某個產品等級結構中。

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

具體產品(concreteproduct):它定義具體工廠生產的具體產品物件,實現抽象產品介面中宣告的業務方法。在抽象工廠中宣告了多個工廠方法,用於建立不同型別的產品

//抽象產品類a

class

abstractproducta

;//具體產品類a

class

concreteproducta

:public abstractproducta

;//抽象產品類b

class

abstractproductb

;//具體產品類b

class

concreteproductb

:public abstractproductb

;//抽象工廠類

class

abstractfactory

;//具體工廠類a

class

concretefactorya

:public abstractfactory

;//具體工廠類b

///定義抽象產品類

class

abstractphoneproduct

;///定義抽象產品類

class

abstracttvproduct

;

///2個具體產品類

///具體產品類 hwphone

class

hwphone

:public abstractphoneproduct

;void

productname

() override

void

productintroduction

() override};

///具體產品類 miphone

class

miphone

:public abstractphoneproduct

;void

productname

() override

void

productintroduction

() override};

///2個具體產品類

///具體產品類 hwtv

class

hwtv

:public abstracttvproduct

;void

productname

() override

void

productintroduction

() override};

///具體產品類 mitv

class

mitv

:public abstracttvproduct

;void

productname

() override

void

productintroduction

() override

};

/// 定義抽象工廠類

class

abstractfactory

;

///兩個具體工廠類

///具體工廠類 生產多個產品

class

hwfactory

:public abstractfactory

; abstractphoneproduct *

createphone

() override

abstracttvproduct *

createtv

() override};

///具體工廠類 生產多個產品

個人能力有限,如有錯誤之處或者其他建議,敬請告知歡迎**,謝謝!

設計模式之抽象工廠模式 C 實現

前面兩篇文章分別介紹了,簡單工廠模式以及工廠方法模式。接下來我將介紹一下,抽象工廠模式。抽象工廠模式主要用於具有複雜層級和分類的設計中。比如,分別把網絡卡驅動和音效卡驅動當作一種product。那windows和linux以及mac都需要這兩種product。此類設計使用抽象工廠模式最合適不過。抽象...

C 實現設計模式 抽象工廠模式

感覺抽象工廠模式有點像你去買電腦的時候,先告訴賣電腦的你要買聯想的,然後再告訴賣電腦的你要個滑鼠,最後你喜提聯想的滑鼠回家了。這裡也感謝菜鳥教程,提供免費的學習資料。優點 當乙個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同乙個產品族中的物件。缺點 產品族擴充套件非常困難,要增加乙...

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

抽象工廠模式 比工廠模式具有更高層次的抽象性,當要返回一系列相關類中的某一格,而對每個類都能根據需要返回不同的物件時候,這種模式就派上了用場。換言之,抽象工廠是乙個工廠物件。它能返回一系列相關類中的某一格,可以用簡單工廠決定哪乙個類。下面這個例子作為抽象工廠模式的例子,希望能跟大家一起分享一起進步。...