工厂设计模式

一、简单工厂模式(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. 所有工厂模式的共同优点
    • 降低代码耦合
    • 统一对象创建逻辑
    • 便于维护和扩展
    • 隐藏对象初始化细节
相关推荐
summer__777712 小时前
设计模式知识点总结
设计模式
青山师13 小时前
动态代理深度解析:JDK与CGLIB底层实现与实战
java·设计模式·面试·动态代理·java面试·cglib
蜡笔小马14 小时前
03.C++设计模式-原型模式
c++·设计模式·原型模式
何陋轩20 小时前
Spring AI + RAG实战:打造企业级智能问答系统
后端·算法·设计模式
sindyra1 天前
享元模式(Flyweight Pattern)
java·开发语言·设计模式·享元模式·优缺点
这是程序猿1 天前
设计模式入门:Java 单例模式(Singleton)详解,从入门到实战
java·单例模式·设计模式
suixinm1 天前
Agent 设计模式:从 ReAct、CodeAct 到 Agentic Rag 与多智能体
设计模式·ai·react·rag·ai agent·agent智能体·multi-agent
geovindu1 天前
go: Registry Pattern
开发语言·后端·设计模式·golang·注册模式
05候补工程师1 天前
【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
python·设计模式·pdf·word·策略模式
lsswear1 天前
PHP 设计模式
设计模式·php