設計模式之抽象工廠模式

2022-03-25 10:58:20 字數 4171 閱讀 1960

一、概述

###抽象工廠模式,以乙個鞋業**工廠為例(可**生產nike,adidas的鞋子)

concretefactory1, concretefactory2 這裡對例項工廠的分類,每乙個例項工廠對應一可以看做是生產同一系列(品種)下的產品,

舉例:前者代表nike鞋工廠類,後者代表adidas鞋工廠類。

concreteproducta, concreteproductb 這裡對例項產品的分類,每乙個例項產品可以看做是不同系列的產品集合,

如:分別代表各式鞋子,分別代表布鞋(派生出nike布鞋,adidas布鞋)和皮鞋(派生出nike皮鞋,adidas皮鞋)

1,2,3......代表品種(系列):如nike, adidas

a,b,c......代表產品,其派生類可延伸出各種品種(系列)下的產品,如布鞋,皮鞋

說明:工廠模式下,對管理的產品沒有做進一步的分類,獲取所有產品的返回值都是它們的虛基類,只能看做是對某一類類的操作。

而抽象工廠模式,則對產品進行規劃的基礎上,又再次細分成產品系列;對工廠類也做了擴充套件,返回不再是產品的公共虛基類,而是產品所在系列的基類。

這正如一家鞋業**工廠要生產鞋子一樣,如果它**10家的品牌,這10家品牌都從乙個碼頭出貨,哇咔咔,出貨碼頭人來人往,貨來貨往,好像有點堵哦。

而抽象工廠將產品劃分到系列,為每個系列定義介面,這樣一來,每個品牌的鞋子都有自己的通道來接貨,各品牌之間相互獨立,碼頭也變得井然有序了。

###工廠模式

concretefactory1 :生產(new)多個產品,返回產品的虛基類。

concreteproducta :最終產品,基於虛基類

###抽象工廠模式

concretefactory1 : 生產(new)本系列的多個產品,而且同款產品會存在多個系列,

concreteproducta : 中間產品,上基於虛基類,下派生不同系列下的同款產品

優點:新增系列產品,只需要新增乙個工廠即可。

缺點:新增某一新產品時,就變得困難了

總結:抽象工廠不僅對產品類做了規劃,同時也對工廠類做了改善。具體表現為:對產品的規劃變成了3層結構:產品虛基類-產品系列子類-產品子類;工廠仍保持2層結構,但在第2層做了擴充套件:工廠虛基類-建立產品系列子類

我們前面說過,標準工廠的做法就是定義乙個建立所有產品的公共介面,供工廠派生類使用。

當產品過多時,使用標準工廠就有些力不從心,因為這些產品都來自於同乙個介面,是非常不利於管理的。

二、類圖

三、**

iproduct.h, iproduct.cpp (見簡單工廠模式)

concreteproducta.h, concreteproducta.cpp (同上)

concreteproductb.h, concreteproductb.cpp (同上)

concreteproducta1.h  //產品a: 系列1下的產品a

#pragma once

#include "concreteproducta.h"

class cconcreteproducta1 :public cconcreteproducta

;

concreteproducta1.cpp

#include "concreteproducta1.h"

cconcreteproducta1::cconcreteproducta1()

;

concreteproducta2.cpp

#include "concreteproducta2.h"

cconcreteproducta2::cconcreteproducta2()

;

concreteproductb1.cpp

#include "concreteproductb1.h"

cconcreteproductb1::cconcreteproductb1()

;

concreteproductb2.cpp

#include "concreteproductb2.h"

cconcreteproductb2::cconcreteproductb2()

;

iabstractfactory.cpp

#include "iabstractfactory.h"

iabstractfactory::iabstractfactory()

iabstractfactory::~iabstractfactory()

concreteabsfactory1.h

#pragma once

#include "iabstractfactory.h"

//應該放在cpp檔案裡面

#include "concreteproducta1.h"

#include "concreteproductb1.h"

//工廠派生類1:建立某一系列下的產品,

class cconcreteabsfactory1 :public iabstractfactory

;

concreteabsfactory1.cpp

#include "concreteabsfactory1.h"

cconcreteabsfactory1::cconcreteabsfactory1()

cconcreteabsfactory1::~cconcreteabsfactory1()

cconcreteproducta *cconcreteabsfactory1::createa()

cconcreteproductb *cconcreteabsfactory1::createb()

concreteabsfactory2.h

#pragma once

#include "iabstractfactory.h"

//應該放在cpp檔案裡面

#include "concreteproducta2.h"

#include "concreteproductb2.h"

//工廠派生類2:建立某一系列下的產品,

class cconcreteabsfactory2 :public iabstractfactory

;

concreteabsfactory2.cpp

#include "concreteabsfactory2.h"

cconcreteabsfactory2::cconcreteabsfactory2()

cconcreteabsfactory2::~cconcreteabsfactory2()

cconcreteproducta *cconcreteabsfactory2::createa()

cconcreteproductb *cconcreteabsfactory2::createb()

main.cpp

#include "concreteabsfactory1.h"

#include "concreteabsfactory2.h"

#include using namespace std;

int main()

四、執行結果

[new concreteabsfactory1]:

[create products of 1 serial]:

cconcreteproducta::cconcreteproducta

cconcreteproducta1::cconcreteproducta1

cconcreteproductb::cconcreteproductb

cconcreteproductb1::cconcreteproductb1

[new concreteabsfactory2]:

[create products of 2 serial]:

cconcreteproducta::cconcreteproducta

cconcreteproducta2::cconcreteproducta2

cconcreteproductb::cconcreteproductb

cconcreteproductb2::cconcreteproductb2

請按任意鍵繼續. . .

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

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

設計模式之抽象工廠模式

目標 定義了乙個建立一系列相關或相互依賴的介面,而無需指定它們的具體類。用於交換產品系列,如 access sql server 產品的具體類名被具體工廠的實現分離 下面是示例 include include include using namespace std 使用者抽象介面 class ius...

設計模式之抽象工廠模式

定義 abstract factory,提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類 場景 有一家生產螺絲螺帽的工廠,螺絲有兩種型號 公的和母的,螺帽也有兩種型號 公的和母的。沒個車間只生產一種螺絲和螺帽。這裡車間就是乙個concretefactory 具體工廠 螺絲和螺帽便是...