抽象工厂模式 属于创建型模式,提供了一个创建一系列 产品对象的接口,而无需指定它具体的类。
参与者:
- AbstractFactory : 声明一个创建抽象产品对象的接口
- ConcretFactory :实现创建具体产品对象的操作
- AbstractPorduct : 为一个系列产品声明一个接口
- ConcretProduct : 实现AbstractPorduct的操作
适用性:
- 一个系统要独立于它的产品的创建、组合和表示时
- 一个系统要由多个系列产品来配置时
- 提供一个产品类库,而只想显示它们的接口而不是实现的时候
来一个极端的例子,一个老板有好几个工厂都是一个模子里刻出来(AbstractFactory)的, 每个工厂(ConcretFactory)只能生产两种播放器,一种是音频播放器(AbstractPorduct),一种是视频播放器(AbstractPorduct),而这些音频(AbstractPorduct)和视频(AbstractPorduct)又是由多种格式的,比如mp4、avi、flv、mp3、wma等等。每一种格式的文件他们的文件头都不同,要为他们每一个单独创建一个类,又很麻烦。所以就有两个基类:Video和Audio。同时这个工厂生产的播放器呢,还只能播放这其中的几种格式。(阿西吧好蛋疼的厂)
class Audio
{
public:
Audio(){};
virtual ~Audio(){};
virtual void Head() = 0;
};
class Mp3 :public Audio
{
public:
Mp3 (){};
virtual ~Mp3(){};
virtual void Head() override
{
printf("Mp3 head \n");
}
};
class WMA :public Audio
{
public:
WMA (){};
virtual ~WMA (){};
virtual void Head() override
{
printf("WMA head \n");
}
};
class Vedio
{
public:
Vedio(){};
virtual ~Vedio(){};
virtual void Head() = 0;
};
class Mp4 :public Vedio
{
public:
Mp4 (){};
virtual ~Mp4 (){};
virtual void Head() override
{
printf("Mp4 \n");
}
};
class Flv :public Vedio
{
public:
Flv (){};
virtual ~Flv (){};
virtual void Head() override
{
printf("Flv \n");
}
};
class AbstractFactory
{
public:
AbstractFactory(){};
virtual ~AbstractFactory(){};
virtual Vedio* CreateVedio() = 0;
virtual Audio* CreateAudio() = 0;
};
class FactoryA :public AbstractFactory
{
public:
FactoryA (){};
virtual ~FactoryA (){};
virtual Vedio* CreateVedio() override
{
return new Mp4();
}
virtual Audio* CreateAudio() override
{
return new Mp3();
}
};
class FactoryB :public AbstractFactory
{
public:
FactoryB (){};
virtual ~FactoryB (){};
virtual Vedio* CreateVedio() override
{
return new Flv();
}
virtual Audio* CreateAudio() override
{
return new WMA();
}
};