學習總結
(1)抽象工廠模式結構與工廠方法模式結構類似,不同之處在于,一個具體工廠可以生産多種同類相關的産品。
- 抽象工廠模式的優點:
- 工廠方法用于建立客戶所需産品,同時向客戶隐藏某個具體産品類将被執行個體化的細節,使用者隻需關心所需産品對應的工廠;
- 新加入産品系列時,無需修改原有系統,增強了系統的可擴充性,符合開閉原則。
- 抽象工廠模式的缺點:
- 在已有産品系列中添加新産品時需要修改抽象層代碼,對原有系統改動較大,違背開閉原則
- 适用環境:
- 一系列/一族産品需要被同時使用時,适合使用抽象工廠模式;
- 産品結構穩定,設計完成之後不會向系統中新增或剔除某個産品
抽象工廠模式中,如果需要新增加一個系列的産品,比如足球系列,隻需增加一族新的具體産品類(抽象和具體)并提供一個對應的工廠類即可。但是,如果要在已有的産品族裡增加另一個産品,比如Jungle打籃球,除了需要籃球和籃球衣外,Jungle還想換雙籃球鞋,這時候該怎麼辦呢?是不是要去修改BasketballFactory呢?
文章目錄
- 學習總結
- 一、抽象工廠模式
- 1.1 抽象工廠模式結構
- 1.2 抽象工廠模式的栗子
- 二、AbstractFactory.h頭檔案
- 三、用戶端代碼
一、抽象工廠模式
抽象工廠模式,其抽象程度更高,每一個具體工廠可以生産一組相關的具體産品對象。
抽象工廠模式的定義:提供一個建立一系列相關或互相依賴對象的接口,而無需指定他們具體的類。
1.1 抽象工廠模式結構
抽象工廠模式結構與工廠方法模式結構類似,不同之處在于,一個具體工廠可以生産多種同類相關的産品:
- 抽象工廠(AbstractFactory):所有生産具體産品的工廠類的基類,提供工廠類的公共方法;
- 具體工廠(ConcreteFactory):生産具體的産品
- 抽象産品(AbstractProduct):所有産品的基類,提供産品類的公共方法
- 具體産品(ConcreteProduct):具體的産品類
結合抽象工廠模式定義和UML,可以看到具體工廠
ConcreteFactory_A
可以生産兩種産品,分别是
ConcreteProduct_A_1
和
ConcreteProduct_A_2
,另一個具體工廠
ConcreteFactory_B
同理。用戶端使用時,需要聲明一個抽象工廠
AbstractFactory
和兩個抽象産品
AbstractProduct
。
1.2 抽象工廠模式的栗子
籃球保管室可以提供籃球和籃球衣,足球保管室可以提供足球和足球衣。Jungle隻要根據心情去某個保管室,就可以換上球衣、拿上球,然後就可以愉快地玩耍了。
對應的UML執行個體圖:
二、AbstractFactory.h頭檔案
//抽象工廠類
class AbstractFactory
{
public:
virtual AbstractBall *getBall() = 0;
virtual AbstractShirt *getShirt() = 0;
};
//抽象産品類AbstractBall
class AbstractBall
{
public:
AbstractBall(){}
//抽象方法:
void play(){};
};
//具體産品類Basketball
class Basketball :public AbstractBall
{
public:
Basketball(){
play();
}
//具體實作方法
void play(){
printf("Jungle play Basketball\n\n");
}
};
//具體産品類Football
class Football :public AbstractBall
{
public:
Football(){
play();
}
//具體實作方法
void play(){
printf("Jungle play Football\n\n");
}
};
//抽象産品類AbstractShirt
class AbstractShirt
{
public:
AbstractShirt(){}
//抽象方法:
void wearShirt(){};
};
//具體産品類BasketballShirt
class BasketballShirt :public AbstractShirt
{
public:
BasketballShirt(){
wearShirt();
}
//具體實作方法
void wearShirt(){
printf("Jungle wear Basketball Shirt\n\n");
}
};
//具體産品類FootballShirt
class FootballShirt :public AbstractShirt
{
public:
FootballShirt(){
wearShirt();
}
//具體實作方法
void wearShirt(){
printf("Jungle wear Football Shirt\n\n");
}
};
//抽象工廠類
class AbstractFactory
{
public:
virtual AbstractBall *getBall() = 0;
virtual AbstractShirt *getShirt() = 0;
};
//具體工廠類BasketballFactory
class BasketballFactory :public AbstractFactory
{
public:
BasketballFactory(){
printf("BasketballFactory\n");
}
AbstractBall *getBall(){
printf("Jungle get basketball\n");
return new Basketball();
}
AbstractShirt *getShirt(){
printf("Jungle get basketball shirt\n");
return new BasketballShirt();
}
};
//具體工廠類BasketballFactory
class FootballFactory :public AbstractFactory
{
public:
FootballFactory(){
printf("FootballFactory\n");
}
AbstractBall *getBall(){
printf("Jungle get football\n");
return new Football();
}
AbstractShirt *getShirt(){
printf("Jungle get football shirt\n");
return new FootballShirt();
}
};
三、用戶端代碼
#include <iostream>
#include "AbstractFactory.h"
int main()
{
printf("抽象工廠模式\n");
//定義工廠類對象和産品類對象
AbstractFactory *fac = NULL;
AbstractBall *ball = NULL;
AbstractShirt *shirt = NULL;
fac = new BasketballFactory();
ball = fac->getBall();
shirt = fac->getShirt();
fac = new FootballFactory();
ball = fac->getBall();
shirt = fac->getShirt();
system("pause");
return 0;
}