[创建型模式] 简单工厂模式

目录

一 介绍

二 业务背景

2.1 需求

2.2 高层模块

2.3 抽象模块

2.4 底层模块

三 UML类图

四 代码实现


一 介绍

分类: 创建型模式

思想: 工厂模式顾名思义就是产生产品的地方,也可以理解成产生对象的地方,而在设计模式中最终的设计一般都是需要满足: 高层调用者越简单越好,封装一些复杂的实现过程。

优点: 定义一个用于创建对象的接口,但不直接实现该接口。它根据传入的参数,动态地创建并返回相应的对象。这种模式的优点是简单易用

缺点:违反了开闭原则,即当需要添加新的产品时,需要修改工厂类的代码。


二 业务背景

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;
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值