一、定义
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。
工厂模式只能生产一个产品。例如:产品要么香蕉、要么苹果,但抽象工厂可以一下生产一个产品族,如水果、动物、蔬菜等。
二、角色
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、系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使用户能够动态改变产品族,也可以很方便的增加新的产品族;