[创建型模式] 抽象工厂模式

本文介绍了如何使用抽象工厂模式处理汽车定制需求,如颜色、型号和自动驾驶功能。通过UML类图展示了产品的抽象和具体类,以及如何创建针对不同配置的工厂。代码实现部分展示了如何实例化和操作这些产品类。
摘要由CSDN通过智能技术生成

目录

一 介绍

1.1 业务需求

1.2 思想

二 UML类图

三 代码实现


一 介绍

继上篇: 工厂模式

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值