工厂设计模式

一、简单工厂模式(Simple Factory)

1. 核心思想

一个工厂类,根据传入的参数,决定创建哪一种具体产品对象。 所有产品共用同一个工厂,结构最简单,也叫静态工厂模式

2. 模式结构

  • 抽象产品(Product):定义产品的公共接口
  • 具体产品(ConcreteProduct):实现抽象产品的具体类
  • 工厂类(Factory):提供静态方法,根据参数创建不同产品

3. C++ 代码实现

以 ** 创建不同形状(圆形、方形)** 为例:

复制代码
#include <iostream>
using namespace std;

// ===================== 1. 抽象产品:定义公共接口 =====================
class Shape {
public:
    virtual void draw() = 0;   // 纯虚函数,抽象方法
    virtual ~Shape() = default;
};

// ===================== 2. 具体产品:圆形 =====================
class Circle : public Shape {
public:
    void draw() override {
        cout << "绘制圆形 ✅" << endl;
    }
};

// ===================== 具体产品:方形 =====================
class Rectangle : public Shape {
public:
    void draw() override {
        cout << "绘制方形 ✅" << endl;
    }
};

// ===================== 3. 简单工厂类:核心创建逻辑 =====================
class ShapeFactory {
public:
    // 静态方法:根据类型创建对应形状对象
    static Shape* createShape(const string& type) {
        if (type == "circle") {
            return new Circle();
        } else if (type == "rectangle") {
            return new Rectangle();
        }
        return nullptr; // 无匹配类型
    }
};

// ===================== 客户端使用 =====================
int main() {
    // 客户端只调用工厂,不直接new Circle/Rectangle
    Shape* shape1 = ShapeFactory::createShape("circle");
    Shape* shape2 = ShapeFactory::createShape("rectangle");

    shape1->draw();
    shape2->draw();

    // 释放内存
    delete shape1;
    delete shape2;
    return 0;
}

4. 优缺点

表格

优点 缺点
代码简单,使用方便 严重违背开闭原则:新增产品必须修改工厂类
客户端与具体产品解耦 产品过多时,工厂类代码臃肿
统一管理对象创建 无法形成继承结构,扩展受限

5. 应用场景

  • 产品类型数量少、几乎不扩展
  • 客户端只需要简单获取对象,不关心创建逻辑
  • 小工具、简单业务模块(如日志对象、配置对象创建)

二、工厂方法模式(Factory Method)

1. 核心思想

一个产品对应一个工厂,不再共用一个工厂。

  • 抽象工厂定义创建接口
  • 每个具体产品对应一个具体工厂
  • 新增产品时,只新增工厂类,不修改原有代码完全符合开闭原则

2. 模式结构

  • 抽象产品
  • 具体产品
  • 抽象工厂:定义创建产品的接口
  • 具体工厂:每个工厂只创建一种产品

3. C++ 代码实现

延续形状案例,改造为工厂方法:

复制代码
#include <iostream>
using namespace std;

// ===================== 1. 抽象产品 =====================
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() = default;
};

// ===================== 2. 具体产品 =====================
class Circle : public Shape {
public:
    void draw() override { cout << "绘制圆形" << endl; }
};

class Rectangle : public Shape {
public:
    void draw() override { cout << "绘制方形" << endl; }
};

// ===================== 3. 抽象工厂:定义创建接口 =====================
class ShapeFactory {
public:
    virtual Shape* createShape() = 0;
    virtual ~ShapeFactory() = default;
};

// ===================== 4. 具体工厂:圆形工厂 =====================
class CircleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Circle();
    }
};

// ===================== 具体工厂:方形工厂 =====================
class RectangleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Rectangle();
    }
};

// ===================== 客户端使用 =====================
int main() {
    // 创建圆形工厂 → 生产圆形
    ShapeFactory* factory1 = new CircleFactory();
    Shape* circle = factory1->createShape();
    circle->draw();

    // 创建方形工厂 → 生产方形
    ShapeFactory* factory2 = new RectangleFactory();
    Shape* rect = factory2->createShape();
    rect->draw();

    // 释放内存
    delete circle;
    delete factory1;
    delete rect;
    delete factory2;
    return 0;
}

4. 优缺点

表格

优点 缺点
完全符合开闭原则,新增产品只加类,不改旧代码 类数量爆炸:每加一个产品,就要加一个工厂类
单一职责:一个工厂只造一种产品 结构比简单工厂复杂,理解成本稍高
解耦更彻底,便于单元测试 客户端需要知道不同工厂的存在

5. 应用场景

  • 产品类型需要频繁扩展
  • 单一产品等级结构(只有一类产品)
  • 框架设计、中间件、SDK 底层(如 Spring Bean 工厂)

三、抽象工厂模式(Abstract Factory)

1. 核心思想

工厂生产「产品族」,而不是单个产品。

  • 产品族:一组相关 / 相互依赖的产品(如华为工厂生产:华为手机 + 华为电脑)
  • 一个抽象工厂可以创建多个不同类型的产品

2. 模式结构

  • 抽象产品族:多个抽象产品(Phone、Computer)
  • 具体产品族:华为手机、华为电脑;苹果手机、苹果电脑
  • 抽象工厂:定义创建所有产品的接口
  • 具体工厂:华为工厂、苹果工厂

3. C++ 代码实现

电子设备产品族为例:

复制代码
#include <iostream>
using namespace std;

// ===================== 1. 抽象产品A:手机 =====================
class Phone {
public:
    virtual void showBrand() = 0;
    virtual ~Phone() = default;
};

// ===================== 抽象产品B:电脑 =====================
class Computer {
public:
    virtual void showBrand() = 0;
    virtual ~Computer() = default;
};

// ===================== 2. 具体产品族:华为 =====================
class HuaweiPhone : public Phone {
public:
    void showBrand() override { cout << "华为手机" << endl; }
};

class HuaweiComputer : public Computer {
public:
    void showBrand() override { cout << "华为电脑" << endl; }
};

// ===================== 具体产品族:苹果 =====================
class ApplePhone : public Phone {
public:
    void showBrand() override { cout << "苹果手机" << endl; }
};

class AppleComputer : public Computer {
public:
    void showBrand() override { cout << "苹果电脑" << endl; }
};

// ===================== 3. 抽象工厂:能生产手机+电脑 =====================
class ElectronicFactory {
public:
    virtual Phone* createPhone() = 0;
    virtual Computer* createComputer() = 0;
    virtual ~ElectronicFactory() = default;
};

// ===================== 4. 具体工厂:华为工厂 =====================
class HuaweiFactory : public ElectronicFactory {
public:
    Phone* createPhone() override { return new HuaweiPhone(); }
    Computer* createComputer() override { return new HuaweiComputer(); }
};

// ===================== 具体工厂:苹果工厂 =====================
class AppleFactory : public ElectronicFactory {
public:
    Phone* createPhone() override { return new ApplePhone(); }
    Computer* createComputer() override { return new AppleComputer(); }
};

// ===================== 客户端使用 =====================
int main() {
    // 华为工厂生产华为全家桶
    ElectronicFactory* factory = new HuaweiFactory();
    Phone* phone = factory->createPhone();
    Computer* computer = factory->createComputer();

    phone->showBrand();
    computer->showBrand();

    // 切换为苹果工厂
    factory = new AppleFactory();
    phone = factory->createPhone();
    computer = factory->createComputer();

    phone->showBrand();
    computer->showBrand();

    return 0;
}

4. 优缺点

表格

优点 缺点
保证产品族的一致性(华为工厂只造华为产品) 扩展新产品极难:要修改所有工厂类
符合开闭原则(新增产品族只加类) 结构最复杂,理解成本最高
强约束,避免产品不匹配 只适用于多产品族的固定结构

5. 应用场景

  • 存在多个产品系列 / 产品族
  • 产品之间有依赖、约束关系
  • 系统需要切换不同的产品组合(如换肤、多数据库兼容)
  • 经典案例:UI 组件库(浅色 / 深色主题)、数据库驱动工厂

四、三代工厂模式核心对比(必记)

表格

模式 核心特点 开闭原则 复杂度 适用场景
简单工厂 一个工厂造所有产品 ❌ 违背 产品少、不扩展
工厂方法 一个工厂造一种产品 ✅ 遵守 单类产品、常扩展
抽象工厂 一个工厂造一族产品 ✅ 遵守 多产品族、固定结构

五、工厂模式终极总结

  1. 本质 :封装 new 过程,解耦创建与使用
  2. 简单工厂:入门版,适合小场景,违反开闭
  3. 工厂方法:标准版,最常用,完美遵循开闭
  4. 抽象工厂:高级版,适合多产品族,约束性强
  5. 所有工厂模式的共同优点
    • 降低代码耦合
    • 统一对象创建逻辑
    • 便于维护和扩展
    • 隐藏对象初始化细节
相关推荐
两年半的个人练习生^_^4 小时前
每日一学:设计模式之建造者模式
java·开发语言·设计模式
sg_knight15 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
渔舟小调21 小时前
P11 | 收藏与行程:用户行为类接口的设计模式
数据库·设计模式·oracle
小程故事多_801 天前
从基础Agent到复杂工作流,LangGraph如何用状态机重构智能体开发
人工智能·设计模式·重构·aigc·ai编程
hypoy1 天前
Claude Code 的 1M Context 怎么用:一篇官方文章的读后整理
设计模式·claude
IT 行者1 天前
软件设计模式会不会是制约大模型编程的障碍?
设计模式·ai编程
t***5441 天前
还有哪些设计模式适合现代C++
开发语言·c++·设计模式
t***5441 天前
如何在现代C++项目中有效应用这些设计模式
开发语言·c++·设计模式
贵慜_Derek1 天前
我们能从 DeerFlow 学到哪些优秀的技术架构设计
人工智能·设计模式·架构