一 介绍
继上篇: 简单工厂模式
如果有新的汽车品牌可以供消费者来选择时,这时候要想复用原来的代码就需要打破简单工厂模式中的工厂类,这虽然也可以解决实际的业务需求,但很明显不符合设计模式的思想(封闭原则)
封闭原则 : 类应该是对扩展开放,对修改封闭.
这时候我们就需要去抽象工厂类,让每个工厂类去继承这个抽象工厂类,这样在以后有新的品牌加入的时候就可以直接继承这个抽象工厂类来生成产品
二 UML 类图
三 代码实现
#include <iostream>
#include <windows.h>
using namespace std;
// 抽象产品类
class AbstractNewEnergy
{
public:
virtual void Mode() = 0;
virtual void Color() = 0;
virtual void Automatic() = 0;
virtual ~AbstractNewEnergy(){}
};
// 具体的产品类
class BYDNewEnergy : public AbstractNewEnergy
{
public:
using AbstractNewEnergy::AbstractNewEnergy;
virtual void Mode() override
{
cout<<"型号: BYD-秦DMI-一统天下"<<endl;
}
virtual void Color() override
{
cout<<"颜色: 白白白白白白白白白白白白"<<endl;
}
virtual void Automatic() override
{
cout<<"本车型不支持自动驾驶技术"<<endl;
}
~BYDNewEnergy(){}
};
class TeslaNewEnergy : public AbstractNewEnergy
{
public:
using AbstractNewEnergy::AbstractNewEnergy;
virtual void Mode() override
{
cout<<"型号: Tesla-赛博皮卡"<<endl;
}
virtual void Color() override
{
cout<<"颜色: 白白白白白白白白白白白白"<<endl;
}
virtual void Automatic() override
{
cout<<"本车型不支持自动驾驶技术"<<endl;
}
virtual ~TeslaNewEnergy()override{}
};
class AudiNewEnergy : public AbstractNewEnergy
{
public:
using AbstractNewEnergy::AbstractNewEnergy;
virtual void Mode() override
{
cout<<"型号: Audi-Rs7"<<endl;
}
virtual void Color() override
{
cout<<"颜色: 白白白白白白白白白白白白"<<endl;
}
virtual void Automatic() override
{
cout<<"请谨慎选择自动驾驶模式"<<endl;
}
virtual ~AudiNewEnergy()override{}
};
// 抽象工厂类
class AbstractNewEnergyFactory
{
public:
virtual AbstractNewEnergy* createNewEnergy() = 0;
virtual ~AbstractNewEnergyFactory(){};
};
// 比亚迪(产品)工厂
class BYDFactory : public AbstractNewEnergyFactory
{
public:
AbstractNewEnergy* createNewEnergy() override
{
return new BYDNewEnergy;
}
~BYDFactory()override
{
cout<<"释放车辆资源";
}
};
// 特斯拉(产品)工厂
class TeslaFactory : public AbstractNewEnergyFactory
{
public:
AbstractNewEnergy* createNewEnergy() override
{
return new TeslaNewEnergy;
}
~TeslaFactory()override
{
cout<<"释放车辆资源";
}
};
// 奥迪(产品)工厂
class AudiFactory : public AbstractNewEnergyFactory
{
public:
AbstractNewEnergy* createNewEnergy() override
{
return new AudiNewEnergy;
}
~AudiFactory()override
{
cout<<"释放车辆资源";
}
};
int main()
{
SetConsoleOutputCP(CP_UTF8);
// 奥迪工厂
AbstractNewEnergyFactory *factory = new AudiFactory;
AbstractNewEnergy *obj = factory->createNewEnergy();
obj->Mode();
obj->Color();
obj->Automatic();
delete factory;
return 0;
}