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

2021-10-23 12:52:14 字數 2821 閱讀 7624

3.2 定義工廠類

3.3 客戶端使用方法例項

3.4 效果

4. 抽象工廠模式總結

回顧之前的設計模式,簡單工廠模式將所有邏輯都封裝在工廠類中,工廠根據客戶提供的產品名字建立對應產品的物件例項;工廠模式將產品的建立過程放到了具體工廠類中,每乙個工廠可以建立乙個具體產品,由此可能會建立許多任務廠類。很多時候,乙個工廠不只是生產一種產品,而是生產一類產品,比如乙個體育用品工廠,可以生產籃球、足球、排球等多種產品。此時我們可以把這些相關的產品歸納為乙個 「產品族」,由同乙個工廠來生產,這即是今天要學習的抽象工廠模式。

抽象工廠模式是常用的建立型設計模式之一。而今天要學習的抽象工廠模式,其抽象程度更高,每乙個具體工廠可以生產一組相關的具體產品物件

抽象工廠模式定義:

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

簡言之,乙個工廠可以提供建立多種產品的介面,而無需向工廠方法一樣,為每乙個產品都提供乙個具體工廠。

抽象工廠模式 uml 類圖如下:

結合抽象工廠模式定義和 uml,可以看到具體工廠 concretefactory_a 可以生產兩種產品,分別是 concreteproduct_a_1 和 concreteproduct_a_2,另乙個工廠 concretefactory_b 同理。客戶端使用時,需要宣告乙個抽象工廠 abstractfactory 和 兩個抽象產品 abstractproduct。

jungle想要進行戶外運動,它可以選擇打籃球和踢足球。但這次jungle不想弄髒原本穿的t恤,所以jungle還需要穿球衣,打籃球就穿籃球衣,踢足球就穿足球衣。籃球保管室可以提供籃球和籃球衣,足球保管室可以提供足球和足球衣。jungle只要根據心情去某個保管室,就可以換上球衣、拿上球,然後就可以愉快地玩耍了。

對應的 uml 例項圖如下:

3.1.1 產品類 ball
class

abstractball

// 抽象方法

void

play()

};

class

basketball

:public abstractball

void

play()

};

3.1.2 產品類 shirt
class

abstractshirt

// 抽象方法

抽象工廠模式中,如果需要新增加乙個系列的產品,比如足球系列,則需要增加一組新的具體產品類(抽象和具體)並提供給乙個對應的工廠類即可。但是,如果要在已有的產品族裡增加另外乙個產品,比如在打籃球,除了需要籃球和籃球衣之外,還想一雙籃球鞋,這時候該怎麼辦呢?是不是要去修改 basketballfactory 呢?由此,總結了抽象模式特點:

優點:抽象工廠模式除了具有工廠模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少都存在一定的聯絡,抽象工廠模式就可以在類內部對產品族的關聯關係進行定義和描述,而不必專門引入乙個新的類來進行管理。

缺點:

產品族的擴充套件將是一件十分費力的事情,假如產品族中需要增加乙個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的。

適用環境:

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

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

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

概念 抽象工廠模式提供了乙個建立相似或相關相互依賴的物件,而不需要說明其具體的實現.類結構圖 圖來自 wiki 示例 include class button class winbutton public button class macbutton public button class scro...

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

在 c 設計模式之工廠方法模式 一文中我們提到,由於簡單工廠模式當中的工廠類職責過重,嚴重違反了單一職責的原則,導致系統擴充套件十分困難,於是引出了工廠方法模式,工廠方法模式引入抽象的工廠類,具體的建立工作推遲到每個具體的工廠類中,這樣每個具體工廠類只負責一種產品的建立,這樣每個具體工廠類的職責就足...