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);

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

七、设计思想

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

核心原则:

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

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

相关推荐
红尘散仙3 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记4 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆4 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪5 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6165 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364575 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao6 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒7 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰8 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox8 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全