目录
一 介绍
继上篇: 工厂模式
1.1 业务需求
对上篇我们了解到,如果想要增加品牌时,也就是增加产品时,我们只需要一个扩展相对应的产品类,就可以通过工厂模式打造出这个产品。但是当我们想要自己自由的选择汽车颜色,型号,自动驾驶功能(产品族)时,工厂模式就不能满足这样的需求了,我们就需要将产品簇也进行抽象,这样无论是顾客提出的哪种汽车颜色,型号,自动驾驶功能时,都只需要扩展产品簇的接口类就可以实现了。
1.2 思想
- 抽象工厂模式关注的是“产品族”(Family of Products),也就是相关或相互依赖的一组产品。比如在一个汽车生产系统中,可以有轿车产品族,其中包括轿车的各种型号、颜色、内饰风格以及是否支持自动驾驶等功能配置,各个配置组合起来形成一辆完整的轿车。
二 UML类图
三 代码实现
#include <iostream>
#include <windows.h>
using namespace std;
// 车型配置的抽象基类
class AbstractMode
{
public:
virtual void Mode() = 0;
virtual ~AbstractMode(){}
};
// 颜色配置的抽象基类
class AbstractColor
{
public:
virtual void Color() = 0;
virtual ~AbstractColor(){}
};
// 自动驾驶配置的抽象基类
class AbstractAutomatic
{
public:
virtual void Automatic() = 0;
virtual ~AbstractAutomatic(){}
};
// 型号配置具体类-奥迪
class AudiMode: public AbstractMode
{
public:
using AbstractMode::AbstractMode;
void Mode() override
{
cout<<"===========恭喜您订购奥迪跑车:祝您事业有成步步高升========="<<endl;
cout<<"车辆型号: 奥迪跑车"<<endl;
}
~AudiMode()override{}
};
// 型号配置具体类-特斯拉
class TeslaMode: public AbstractMode
{
public:
using AbstractMode::AbstractMode;
void Mode() override
{
cout<<"===========恭喜您订购特斯拉电动车:祝您事业有成步步高升========="<<endl;
cout<<"车辆型号: 特斯拉电动车"<<endl;
}
~TeslaMode()override{}
};
// 颜色配置具体类-红色
class RedColor: public AbstractColor
{
public:
using AbstractColor::AbstractColor;
void Color() override
{
cout<<"车辆颜色: 红色"<<endl;
}
~RedColor()override{}
};
// 颜色配置具体类-白色
class WhiteColor: public AbstractColor
{
public:
using AbstractColor::AbstractColor;
void Color() override
{
cout<<"车辆颜色: 白色"<<endl;
}
~WhiteColor()override{}
};
// 自动驾驶配置具体类-支持自动驾驶
class CanAutomatic : public AbstractAutomatic
{
public:
using AbstractAutomatic::AbstractAutomatic;
void Automatic()override
{
cout<<"自动驾驶:支持"<<endl;
}
~CanAutomatic()override{}
};
// 自动驾驶配置具体类-不支持自动驾驶
class NoAutomatic : public AbstractAutomatic
{
public:
using AbstractAutomatic::AbstractAutomatic;
void Automatic()override
{
cout<<"自动驾驶:不支持"<<endl;
}
~NoAutomatic()override{}
};
// 产品类
class NewEnergy
{
public:
explicit NewEnergy(AbstractMode* mode,AbstractColor* color,AbstractAutomatic* automatic)
{
m_mode = mode;
m_color = color;
m_automatic = automatic;
}
void Mode()
{
m_mode->Mode();
}
void Color()
{
m_color->Color();
}
void Automatic()
{
m_automatic->Automatic();
}
~NewEnergy()
{
// 析构了 说明是组合关系 而不是聚合
delete m_mode;
delete m_color;
delete m_automatic;
}
private:
AbstractMode* m_mode = nullptr;
AbstractColor* m_color = nullptr;
AbstractAutomatic* m_automatic = nullptr;
};
// 抽象工厂类--生产产品
class AbstractNewEnergyFactory
{
public:
virtual NewEnergy* creatNewEnergyCar() = 0;
virtual ~AbstractNewEnergyFactory(){}
};
// 生产红色奥迪高级跑车(可以自动驾驶)的工厂
class RedAudiCanAutoFactory : public AbstractNewEnergyFactory
{
public:
NewEnergy* creatNewEnergyCar() override
{
return new NewEnergy(new AudiMode,new RedColor,new CanAutomatic);
}
~RedAudiCanAutoFactory()override{ }
};
// 生产白色奥迪高级跑车(不可以自动驾驶)的工厂
class WhiteAudiNoAutoFactory : public AbstractNewEnergyFactory
{
public:
NewEnergy* creatNewEnergyCar() override
{
return new NewEnergy(new AudiMode,new WhiteColor,new NoAutomatic);
}
~WhiteAudiNoAutoFactory()override {}
};
// 生产红色特斯拉新能源电车(可以自动驾驶)的工厂
class RedTeslaAutoFactory : public AbstractNewEnergyFactory
{
public:
NewEnergy* creatNewEnergyCar() override
{
return new NewEnergy(new TeslaMode,new RedColor,new CanAutomatic);
}
~RedTeslaAutoFactory()override {}
};
int main()
{
SetConsoleOutputCP(CP_UTF8);
// 订购红色可以自动驾驶的奥迪跑车产品
AbstractNewEnergyFactory *factory = new RedAudiCanAutoFactory;
NewEnergy *obj = factory->creatNewEnergyCar();
obj->Mode();
obj->Color();
obj->Automatic();
delete obj;
delete factory;
// 订购白色不支持自动驾驶的奥迪轿车产品
factory = new WhiteAudiNoAutoFactory;
obj = factory->creatNewEnergyCar();
obj->Mode();
obj->Color();
obj->Automatic();
delete obj;
delete factory;
// 订购红色可以自动驾驶的特斯拉电动车产品
factory = new RedTeslaAutoFactory;
obj = factory->creatNewEnergyCar();
obj->Mode();
obj->Color();
obj->Automatic();
delete obj;
delete factory;
return 0;
}