目录
一 介绍
分类: 创建型模式
思想: 工厂模式顾名思义就是产生产品的地方,也可以理解成产生对象的地方,而在设计模式中最终的设计一般都是需要满足: 高层调用者越简单越好,封装一些复杂的实现过程。
优点: 定义一个用于创建对象的接口,但不直接实现该接口。它根据传入的参数,动态地创建并返回相应的对象。这种模式的优点是简单易用
缺点:违反了开闭原则,即当需要添加新的产品时,需要修改工厂类的代码。
二 业务背景
2.1 需求
在中亚一个信仰伊斯兰教的国家土库曼斯坦有着这样一个规定,所有的车辆颜色必须为白色才能够上路,当然这个国家大部分建筑也是白色的,所以在这个国家中的居民购买汽车时,在同等配置下,只需要不同汽车品牌的选择,消费者也只需要选择品牌就能够得到相对应的汽车,这对于程序员来讲就可以采用简单工厂模式来设计。我们就可以通过传入品牌来得到产品。
2.2 高层模块
高层模块通常是客户端代码,也就是使用简单工厂来创建对象的代码。这部分代码不直接与具体的产品类交互,而是通过工厂接口来请求所需的产品对象。在简单工厂模式中,高层模块不需要知道具体的产品类如何实现,它只需要知道如何调用工厂方法来获取所需的对象。
即在使用时只需要传入要创建的品牌类型,就能得到对于的新能源汽车。
如果要添加新的产品品牌时,就需要修改抽象模块也就是工厂类,但这在原则上是不允许的。这也是简单工厂类的弊端.
2.3 抽象模块
抽象类,规定的应该遵循的公共接口,无论是产品的抽象类,还是工厂类的抽象类。
在简单工厂模式中不是必须的,
抽象模块通常指的是一个接口或抽象基类,它定义了产品对象应该遵循的公共接口。这个接口或抽象基类不直接实现任何功能,而是定义了产品对象必须实现的方法。在简单工厂模式中,抽象模块不是必需的,因为工厂方法直接返回具体的产品对象,而不是通过接口或抽象基类来返回。但是,使用抽象模块可以增加代码的灵活性和可扩展性,因为工厂可以返回实现了该接口或抽象基类的任何产品对象。
2.4 底层模块
真正实现底层逻辑的部分
底层模块是具体的产品类,它们实现了高层模块所需的功能。这些类通常包含具体的业务逻辑和数据,是实际执行任务的类。在简单工厂模式中,底层模块是直接被工厂类创建和返回的对象。这些对象通常是不可替换的,也就是说,工厂类直接负责创建这些具体的产品对象,而客户端代码不需要知道这些具体类的存在
三 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{}
};
// 品牌枚举
enum ECarType
{
BYD,
Tesla,
Audi,
};
// 工厂类
class NewEnergyFactory
{
public:
AbstractNewEnergy* createNewEnergy(ECarType carType)
{
AbstractNewEnergy* car = nullptr;
switch (carType){
case BYD:
car = new BYDNewEnergy;
break;
case Tesla:
car = new TeslaNewEnergy;
break;
case Audi:
car = new AudiNewEnergy;
break;
default:
break;
}
return car;
}
};
int main()
{
SetConsoleOutputCP(CP_UTF8);
NewEnergyFactory* factory = new NewEnergyFactory;
// 奥迪
AbstractNewEnergy* audi = factory->createNewEnergy(ECarType::Audi);
audi->Mode();
audi->Color();
audi->Automatic();
return 0;
}