23种设计模式 -【工厂方法】

工厂方法模式(Factory Method Pattern)

核心思想

工厂方法模式 是一种创建型设计模式,其核心思想为:

将对象的创建延迟到子类,而非在代码中直接使用 new 关键字。

简洁定义:

定义一个创建对象的接口,由子类决定实例化具体类。

一、应用背景与问题

传统实现方式

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

class Zombie : public Enemy
{
public:
    void Attack() override
    {
        std::cout<<"Zombie attack"<<std::endl;
    }
};

class Alien : public Enemy
{
public:
    void Attack() override
    {
        std::cout<<"Alien attack"<<std::endl;
    }
};

直接使用:

cpp 复制代码
Enemy* enemy = new Zombie();   // 直接new
enemy->Attack();

存在的问题

  1. 可扩展性差

    • 若新增产品(如 class Robot : public Enemy),需修改所有直接创建对象的代码
    • 可能导致大量条件判断代码,违反开闭原则(对扩展开放,对修改关闭)
  2. 创建逻辑与业务逻辑耦合

    • 复杂的创建过程(如加载模型、初始化AI、设置属性等)会与业务逻辑混杂

解决方案

将对象创建职责分离到专门的工厂类,实现创建与使用的解耦。

二、模式结构

复制代码
        Creator(工厂基类)
             |
    -------------------
    |                 |
ConcreteFactory   ConcreteFactory

        ↓ 创建

        Product(产品基类)
             |
    -------------------
    |                 |
ConcreteProduct  ConcreteProduct

1. Product(产品接口)

定义产品的抽象接口:

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

2. ConcreteProduct(具体产品)

实现具体产品类:

cpp 复制代码
class Zombie : public Enemy
{
public:
    void Attack() override
    {
        std::cout<<"Zombie attack"<<std::endl;
    }
};

class Alien : public Enemy
{
public:
    void Attack() override
    {
        std::cout<<"Alien attack"<<std::endl;
    }
};

3. Creator(工厂基类)

定义创建对象的接口:

cpp 复制代码
class EnemyFactory
{
public:
    virtual Enemy* CreateEnemy() = 0;
};

核心特点:仅定义接口,不创建具体对象。

4. ConcreteCreator(具体工厂)

实现具体的对象创建逻辑:

cpp 复制代码
class ZombieFactory : public EnemyFactory
{
public:
    Enemy* CreateEnemy() override
    {
        return new Zombie();
    }
};

class AlienFactory : public EnemyFactory
{
public:
    Enemy* CreateEnemy() override
    {
        return new Alien();
    }
};

核心特点:负责具体对象的实例化。

三、使用方式

cpp 复制代码
EnemyFactory* factory = new ZombieFactory();
Enemy* enemy = factory->CreateEnemy();
enemy->Attack();

关键变化

  • 传统方式Enemy* enemy = new Zombie();
  • 工厂方法Enemy* enemy = factory->CreateEnemy();

优势

业务代码仅依赖抽象接口EnemyEnemyFactory),而非具体实现类(ZombieAlien 等),实现了解耦

四、核心价值

工厂方法模式本质上解决了对象创建责任的归属问题

  • 责任主体:由子类负责创建对象,而非业务代码
  • 设计思想 :业务代码只需使用对象,无需关心创建细节,体现依赖反转原则

五、与简单工厂模式的区别

简单工厂模式

cpp 复制代码
class EnemyFactory
{
public:
    static Enemy* CreateEnemy(string type)
    {
        if(type=="zombie")
            return new Zombie();

        if(type=="alien")
            return new Alien();
    }
};

特点

  • 单个工厂类负责所有产品的创建
  • 问题:新增产品需修改工厂方法,违反开闭原则

工厂方法模式

特点

  • 每个产品对应一个工厂类(如 Zombie → ZombieFactory
  • 优势:新增产品只需添加新的产品类和工厂类,无需修改原有代码,符合开闭原则

一句话总结区别

  • 简单工厂:一个工厂生产所有产品
  • 工厂方法:每个产品对应一个工厂

六、适用场景

  1. 代码中存在大量直接 new 操作
  2. 条件判断逻辑复杂且频繁变更
  3. 插件式架构 (如仿真框架中的 RadarModelFactoryWeaponFactory 等)

框架中的应用

cpp 复制代码
static WsfEM_Propagation* ObjectFactory(const std::string& aTypeName);

此类实现通常采用工厂方法 + 注册表模式,是工业级代码的常见写法。

七、设计思想

  • 简单工厂:将对象创建集中管理
  • 工厂方法:将对象创建责任下放给子类

核心原则:

通过工厂接口获取对象,而非直接依赖具体实现

这种设计体现了面向对象的设计思维,通过抽象和多态实现系统的灵活性和可扩展性。

相关推荐
行百里er9 分钟前
轻量级 Spring 监测工具——Spring Insight 发布了
spring boot·后端·监控
程序员阿黄37 分钟前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
光影少年44 分钟前
Koa 为什么使用洋葱模型
后端·node.js·koa
用户298698530141 小时前
Python 如何实现 Word 与 RTF 文档互转
后端·python·api
打工仔折腾 AI1 小时前
用 Shell 脚本自动部署 mysqld_exporter 并接入 Prometheus 远程抓取
人工智能·后端·python·性能优化·ai agent 实战
毅炼1 小时前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
Methy1 小时前
IoTHub半个月崩了五次?都是裸rethrow惹的祸
服务器·c++·后端
我不会起名字3221 小时前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
回家路上绕了弯1 小时前
AI 编程助手为什么反复读取同一份上下文?如何减少无效重复
后端
Lost of 程序猿1 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net