23种设计模式 -【抽象工厂】

抽象工厂模式(Abstract Factory Pattern)

一、核心定义

抽象工厂模式 可以理解为:生产一系列相关产品的工厂的抽象

本质:把"创建一组相关对象"的操作统一封装起来。

二、与其他工厂模式的对比

模式 核心思想
简单工厂 一个工厂生产所有产品
工厂方法 一个产品对应一个工厂
抽象工厂 一个工厂生产一整套产品族

重点:抽象工厂不是生产一个产品,而是生产一套配套产品。

示例

  • 电脑 = CPU + 主板 + 内存
  • 必须是同一系列兼容的:
    • Intel 套装:Intel CPU + Intel 主板
    • AMD 套装:AMD CPU + AMD 主板
  • 抽象工厂:
    • Intel工厂 → 生产 Intel CPU + Intel 主板
    • AMD工厂 → 生产 AMD CPU + AMD 主板

三、结构图

复制代码
抽象工厂
    ↓
具体工厂A        具体工厂B
    ↓                ↓
产品A1 A2       产品B1 B2

示例结构

复制代码
AbstractFactory
    createCPU()
    createMainBoard()

IntelFactory
    createCPU()
    createMainBoard()

AMDFactory
    createCPU()
    createMainBoard()

四、C++ 实现示例

1. 产品接口

cpp 复制代码
class CPU {
public:
    virtual void compute() = 0;
};

class MainBoard {
public:
    virtual void install() = 0;
};

2. Intel产品

cpp 复制代码
class IntelCPU : public CPU {
public:
    void compute() override {}
};

class IntelMainBoard : public MainBoard {
public:
    void install() override {}
};

3. AMD产品

cpp 复制代码
class AMDCPU : public CPU {
public:
    void compute() override {}
};

class AMDMainBoard : public MainBoard {
public:
    void install() override {}
};

4. 抽象工厂

cpp 复制代码
class AbstractFactory {
public:
    virtual CPU* createCPU() = 0;
    virtual MainBoard* createMainBoard() = 0;
};

5. 具体工厂

cpp 复制代码
class IntelFactory : public AbstractFactory {
public:
    CPU* createCPU() override {
        return new IntelCPU();
    }

    MainBoard* createMainBoard() override {
        return new IntelMainBoard();
    }
};

class AMDFactory : public AbstractFactory {
public:
    CPU* createCPU() override {
        return new AMDCPU();
    }

    MainBoard* createMainBoard() override {
        return new AMDMainBoard();
    }
};

6. 使用

cpp 复制代码
AbstractFactory* factory = new IntelFactory();

CPU* cpu = factory->createCPU();
MainBoard* board = factory->createMainBoard();

客户端只依赖工厂接口,不依赖具体产品,这是抽象工厂模式的最大价值。

五、本质理解

三种工厂模式本质对比

模式 本质
简单工厂 封装 new
工厂方法 延迟 new 到子类
抽象工厂 封装一组有关联的 new

核心问题解决

抽象工厂解决的是:对象族的一致性问题

  • 不能:Intel CPU + AMD 主板
  • 必须:Intel CPU + Intel 主板

本质:保证对象组合的正确性。

六、使用场景(工程视角)

当系统存在多个产品族时,适合使用抽象工厂模式。

示例

  • 仿真框架中的不同体系:
    • 美军体系:雷达 + 导弹 + 通信
    • 北约体系:雷达 + 导弹 + 通信
  • 可以设计:
    • USFactory
    • NATOFactory
    • 一次创建一整套系统

这也是很多大型仿真框架的常见设计。

七、终极理解

关键区别

text 复制代码
简单工厂:
一个工厂生产所有产品

工厂方法:
一个工厂生产一个产品

抽象工厂:
一个工厂生产一套产品

工程视角

抽象工厂 = 产品族工厂

进阶理解

抽象工厂可以看作是工厂方法的升级版,因为它不仅解决了单个产品的创建问题,还解决了相关产品族的一致性问题,确保了对象组合的正确性。

相关推荐
空空潍6 分钟前
MySQL存储引擎与索引深度解析
后端·sql·mysql·innodb
程序员三明治15 分钟前
【AI】一文讲清 RAG:从大模型局限到企业级知识库落地流程
java·人工智能·后端·ai·大模型·llm·rag
l软件定制开发工作室25 分钟前
Spring开发系列教程(37)——使用Conditional
java·后端·spring
Forget the Dream27 分钟前
基于适配器模式的 Axios 封装实践
设计模式·typescript·axios·适配器模式
yangminlei30 分钟前
Spring Boot Starter自定义开发 构建企业级组件库
java·spring boot·后端
RemainderTime32 分钟前
基于Spring AI + 阿里百炼 DashScope:构建 AI Agent RAG 企业级知识助手
人工智能·后端·spring·ai·es
接着奏乐接着舞33 分钟前
springboot 常用注解
spring boot·后端·python
AI人工智能+电脑小能手35 分钟前
【大白话说Java面试题 第44题】【JVM篇】第4题:什么时候会触发 Young GC?什么时候会触发 Full GC?
java·开发语言·jvm·后端·面试
Java面试题总结1 小时前
【设计模式03】使用模版模式+责任链模式优化实战
设计模式·责任链模式
庞轩px1 小时前
Redis工具类重构——从臃肿到优雅的门面模式实践
数据库·redis·设计模式·重构·门面模式·可扩展性·可维护性