简单工厂模式(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 导致内存泄漏。
三、简单工厂模式的三个角色

四、优缺点
优点
- 客户端不需要知道具体类的创建细节。
- 对象创建逻辑集中,便于统一维护。
- 客户端通过抽象基类使用对象,降低了与具体实现的耦合。
缺点
每增加一种设备,就需要修改工厂类中的 switch,工厂类会不断膨胀。
例如新增激光器设备时,需要添加 LaserDevice,同时修改 DeviceType 和 createDevice()。
因此,简单工厂模式适合产品类型较少、变化不频繁的场景。
五、简单工厂、工厂方法、抽象工厂的区别

记住这三个特点就容易区分:
- 简单工厂: 一个工厂,内部通过判断决定创建什么。
- 工厂方法: 把创建职责交给不同的具体工厂。
- 抽象工厂: 一个工厂负责创建一组相互关联的产品。
对于你的 Qt 设备控制项目,如果只是根据设备类型创建电源、相机或温控对象,简单工厂就很实用;如果设备种类越来越多、需要支持不同厂商的设备实现,则可以进一步考虑工厂方法或抽象工厂模式