一、定義
抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。抽象工廠模式是所有形態的工廠模式中最爲抽象和最其一般性的。
工廠模式只能生產一個產品。例如:產品要麼香蕉、要麼蘋果,但抽象工廠可以一下生產一個產品族,如水果、動物、蔬菜等。
二、角色
1. 抽象工廠(Creator)角色
抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
2. 具體工廠( Concrete Creator)角色
具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
3. 抽象(Product)角色
抽象模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
4. 具體產品(Concrete Product)角色
抽象模式所創建的具體實例對象
UML類圖如下:
三、實現
#include<iostream>
using namespace std;
class AbstractFactory;
//抽象產品族Tea,茶可以是都勻毛尖、鐵觀音、普洱等品種。
class Tea{
public:
virtual void getName() = 0;
};
//抽象產品族Fruit
class Fruit{
public:
virtual void getName() = 0;
};
//抽象工廠,聲明具體可以生產的產品族
class AbstractFactory{
public:
virtual Tea* CreateTea() = 0;//生產產品族Tea
virtual Fruit* CreateFruit() = 0 ;//生產產品族Fruit
};
//水果族的具體水果
class AppleFruit:public Fruit{
public:
void getName(){
cout<<"I'm Apple"<<endl;
}
};
class BananaFruit:public Fruit{
public:
void getName(){
cout<<"I'm Banana"<<endl;
}
};
//茶族的具體茶
class DuyunTea:public Tea{
public:
void getName(){
cout<<"I'm maojianTea"<<endl;
}
};
class PuerhTea:public Tea{
public:
void getName(){
cout<<"I'm PuerhTea"<<endl;
}
};
//具體工廠,都勻工廠
class DunyunFactory:public AbstractFactory{
public:
Tea* CreateTea(){
return new DuyunTea;
}
Fruit* CreateFruit(){
return new BananaFruit();
}
};
//具體工廠,雲南工廠
class YunnanFactory:public AbstractFactory{
public:
Tea* CreateTea(){
return new PuerhTea;
}
Fruit* CreateFruit(){
return new AppleFruit();
}
};
int main(){
AbstractFactory* factory = nullptr;
Fruit *fruit = nullptr;
Tea *tea = nullptr;
//都勻工廠
factory = new DunyunFactory;
tea = factory->CreateTea();
tea->getName();
delete tea;
fruit = factory->CreateFruit();
fruit->getName();
delete fruit;
delete factory;
//雲南工廠
factory = new YunnanFactory;
tea = factory->CreateTea();
tea->getName();
delete tea;
fruit = factory->CreateFruit();
fruit->getName();
delete fruit;
delete factory;
return 0;
}
四、優缺點
優點:
抽象工廠可以一下生產一個產品族,是工廠方法模式的延伸,它提供了功能更爲強大的工廠類並且具備較好的可擴展性;
缺點:
當抽象工廠內確定了能生產的產品後,若要增加產品,必須改動源代碼,所以抽象工廠模式適用於創建固定、沒有變化的類對象。
五、應用場景
1、用戶無需關心對象的創建過程,將對象的創建和使用解耦;
2、產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構;
3、系統中有多於一個的產品族,而每次只使用其中某一產品族。可以通過配置文件等方式來使用戶能夠動態改變產品族,也可以很方便的增加新的產品族;