简单工厂模式(Simple Factory Pattern)——C++

简单工厂模式(Simple Factory Pattern)

简单工厂模式是一种创建型设计模式,它把对象的创建过程集中到一个工厂类中,客户端不需要直接使用 new 创建具体对象,只需要告诉工厂要创建什么对象即可。

在 Qt / C++ 开发中,可以用它统一创建不同类型的设备、相机、通信对象等。

一、基本思想

假设我们要开发一个设备控制程序,需要支持三种设备:

  • 直流电源
  • 红外相机
  • 温度控制器
    如果不使用工厂模式,客户端可能需要这样写:
cpp 复制代码
if (type == "Power")
{
    device = new PowerDevice();
}
else if (type == "Camera")
{
    device = new CameraDevice();
}
else if (type == "Temperature")
{
    device = new TemperatureDevice();
}

如果创建设备的地方很多,每个地方都要写一遍判断逻辑,后续维护就比较麻烦。

简单工厂模式的思路:把这些判断全部放到工厂类中。

二、Qt / C++ 完整示例

我们以设备创建为例,使用 C++14 编写。

1. 定义抽象基类

所有设备都实现相同的接口。

cpp 复制代码
// Device.h
#pragma once
#include <QString>
#include <QDebug>

class Device
{
public:
    virtual ~Device() = default;
    virtual void start() = 0;
};

Device 是抽象类,规定了所有设备必须实现 start() 方法。

2. 创建具体设备类

cpp 复制代码
// PowerDevice.h
#pragma once
#include "Device.h"

class PowerDevice : public Device
{
public:
    void start() override
    {
        qDebug() << "电源设备启动";
    }
};


// CameraDevice.h
#pragma once
#include "Device.h"

class CameraDevice : public Device
{
public:
    void start() override
    {
        qDebug() << "红外相机启动";
    }
};


// TemperatureDevice.h
#pragma once
#include "Device.h"

class TemperatureDevice : public Device
{
public:
    void start() override
    {
        qDebug() << "温控设备启动";
    }
};

3. 创建简单工厂类

这是整个模式的核心:由工厂统一决定创建哪个对象。

cpp 复制代码
// DeviceFactory.h
#pragma once
#include "Device.h"
#include "PowerDevice.h"
#include "CameraDevice.h"
#include "TemperatureDevice.h"

class DeviceFactory
{
public:
    enum DeviceType
    {
        Power,
        Camera,
        Temperature
    };

    static Device* createDevice(DeviceType type)
    {
        switch (type)
        {
        case Power:
            return new PowerDevice();

        case Camera:
            return new CameraDevice();

        case Temperature:
            return new TemperatureDevice();

        default:
            return nullptr;
        }
    }
};

这里使用了 static,因此不需要创建 DeviceFactory 对象,就可以调用工厂方法。

4. 客户端调用

cpp 复制代码
#include "DeviceFactory.h"
#include <memory>

int main()
{
    std::unique_ptr<Device> device(
        DeviceFactory::createDevice(DeviceFactory::Camera));

    if (device)
    {
        device->start();
    }

    return 0;
}

运行结果:

红外相机启动

这里用 std::unique_ptr 管理对象,避免手动 delete 导致内存泄漏。

三、简单工厂模式的三个角色

四、优缺点

优点

  1. 客户端不需要知道具体类的创建细节。
  2. 对象创建逻辑集中,便于统一维护。
  3. 客户端通过抽象基类使用对象,降低了与具体实现的耦合。
    缺点

每增加一种设备,就需要修改工厂类中的 switch,工厂类会不断膨胀。

例如新增激光器设备时,需要添加 LaserDevice,同时修改 DeviceType 和 createDevice()。

因此,简单工厂模式适合产品类型较少、变化不频繁的场景。

五、简单工厂、工厂方法、抽象工厂的区别

记住这三个特点就容易区分:

  • 简单工厂: 一个工厂,内部通过判断决定创建什么。
  • 工厂方法: 把创建职责交给不同的具体工厂。
  • 抽象工厂: 一个工厂负责创建一组相互关联的产品。
    对于你的 Qt 设备控制项目,如果只是根据设备类型创建电源、相机或温控对象,简单工厂就很实用;如果设备种类越来越多、需要支持不同厂商的设备实现,则可以进一步考虑工厂方法或抽象工厂模式
相关推荐
熊猫钓鱼>_>1 小时前
平行视界兼容模式与魔法变量配置避坑【鸿蒙心迹】
运维·服务器·开发语言·笔记·华为·harmonyos·openharmony
大鹏说大话1 小时前
PHP 大文件上传解决方案:分片上传完整思路
开发语言·php
Wang's Blog2 小时前
Java 项目实战:交友项目 - 我的访客:需求说明
java·开发语言·交友
東隅已逝,桑榆非晚2 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
布莱克6052 小时前
C++ 中堆和栈的区别详解
开发语言·c++·栈·堆
像风一样自由20202 小时前
3.Dockerfile如何构建一个Python算法镜像
开发语言·人工智能·python·大模型
誰能久伴不乏3 小时前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
十五年专注C++开发3 小时前
FlatBuffers: 一个高效的零拷贝二进制序列化库
c++·序列化·反序列化·flatbuffers
BuHuaX4 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua