【C++ | 设计模式】简单工厂模式的详解与实现

1.简单工厂模式概述

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义了一个工厂类,由这个类根据提供的参数决定创建哪种具体的产品对象。简单工厂模式将对象的创建逻辑集中到一个工厂类中,从而将对象的创建与对象的使用分离。

2.模式结构

UML 结构图:

  • 核心概念

  • 工厂类(Factory):负责根据不同的输入参数创建不同的产品对象。工厂类通常有一个方法,这个方法根据传入的参数返回不同类型的产品对象。
  • 产品类(Product):被创建的对象,这些对象通常有一个共同的接口或抽象基类。不同的产品类实现了这个接口或继承了这个基类。
  • 客户端(Client):使用工厂类来获取产品对象。客户端不直接创建产品,而是通过工厂类来获取产品对象。

简单工厂模式的工作流程

  1. 客户端工厂类提交产品需求,传递参数给工厂类。
  2. 工厂类根据参数决定创建哪种产品对象
  3. 工厂类创建产品对象,并将其返回给客户端
  4. 客户端使用获得的产品对象。

3.优缺点

优点:

  • 工厂类包含了必要的逻辑判断,根据指定的信息来创建对应的产品。客户端仅负责“消费”产品即可,实现了对象创建和使用的分离

  • 客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。

缺点:

  • 由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。

  • 一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。 这些缺点在 C++工厂方法模式 中得到了一定的克服。

4.适用场景

  • 工厂类负责创建的对象比较少(不会造成工厂方法中的业务逻辑太过复杂)。

  • 客户端仅需知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。 PS: 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

5.案例分析

BBA - 奔驰、宝马、奥迪

互联网行业有三巨头 BAT,汽车界也有三大豪门 BBA - 奔驰、宝马、奥迪。他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。奔驰优雅稳重、宝马操控感强、奥迪大气,更是官车的代表。。。“坐奔驰,开宝马”,足以说明一切。在国内,BBA 大受欢迎,对很多人来说,不仅是代步工具,更是身份的象征。

车再好,也需要在工厂中加工生产,来一起看看简单工厂模式吧!

示例代码:

#include <iostream>
#include <string>

// 产品接口
class Car {
public:
    virtual void describe() const = 0;  // 纯虚函数,描述汽车
    virtual ~Car() = default;           // 虚析构函数,确保派生类的析构函数被调用
};

// 具体产品类 - 奔驰
class Benz : public Car {
public:
    void describe() const override {
        std::cout << "This is a Benz: Elegant and prestigious." << std::endl;
    }
};

// 具体产品类 - 宝马
class BMW : public Car {
public:
    void describe() const override {
        std::cout << "This is a BMW: Strong handling and dynamic driving experience." << std::endl;
    }
};

// 具体产品类 - 奥迪
class Audi : public Car {
public:
    void describe() const override {
        std::cout << "This is an Audi: Stylish and high-tech." << std::endl;
    }
};

// 工厂类
class CarFactory {
public:
    // 静态方法,根据品牌类型创建具体的汽车对象
    static Car* createCar(const std::string& brand) {
        if (brand == "Benz") {
            return new Benz();
        } else if (brand == "BMW") {
            return new BMW();
        } else if (brand == "Audi") {
            return new Audi();
        } else {
            return nullptr;  // 返回空指针,表示无效的品牌
        }
    }
};

int main() {
    // 使用工厂类创建具体汽车对象
    Car* benz = CarFactory::createCar("Benz");
    if (benz) {
        benz->describe();
        delete benz;  // 手动释放内存
    }

    Car* bmw = CarFactory::createCar("BMW");
    if (bmw) {
        bmw->describe();
        delete bmw;  // 手动释放内存
    }

    Car* audi = CarFactory::createCar("Audi");
    if (audi) {
        audi->describe();
        delete audi;  // 手动释放内存
    }

    // 测试无效品牌
    Car* unknown = CarFactory::createCar("Unknown");
    if (!unknown) {
        std::cout << "Unknown car brand" << std::endl;
    }

    return 0;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值