工厂方法模式(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();
存在的问题
-
可扩展性差
- 若新增产品(如
class Robot : public Enemy),需修改所有直接创建对象的代码 - 可能导致大量条件判断代码,违反开闭原则(对扩展开放,对修改关闭)
- 若新增产品(如
-
创建逻辑与业务逻辑耦合
- 复杂的创建过程(如加载模型、初始化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();
优势
业务代码仅依赖抽象接口 (Enemy 和 EnemyFactory),而非具体实现类(Zombie、Alien 等),实现了解耦。
四、核心价值
工厂方法模式本质上解决了对象创建责任的归属问题:
- 责任主体:由子类负责创建对象,而非业务代码
- 设计思想 :业务代码只需使用对象,无需关心创建细节,体现依赖反转原则
五、与简单工厂模式的区别
简单工厂模式
cpp
class EnemyFactory
{
public:
static Enemy* CreateEnemy(string type)
{
if(type=="zombie")
return new Zombie();
if(type=="alien")
return new Alien();
}
};
特点:
- 单个工厂类负责所有产品的创建
- 问题:新增产品需修改工厂方法,违反开闭原则
工厂方法模式
特点:
- 每个产品对应一个工厂类(如
Zombie → ZombieFactory) - 优势:新增产品只需添加新的产品类和工厂类,无需修改原有代码,符合开闭原则
一句话总结区别
- 简单工厂:一个工厂生产所有产品
- 工厂方法:每个产品对应一个工厂
六、适用场景
- 代码中存在大量直接
new操作 - 条件判断逻辑复杂且频繁变更
- 插件式架构 (如仿真框架中的
RadarModelFactory、WeaponFactory等)
框架中的应用
cpp
static WsfEM_Propagation* ObjectFactory(const std::string& aTypeName);
此类实现通常采用工厂方法 + 注册表模式,是工业级代码的常见写法。
七、设计思想
- 简单工厂:将对象创建集中管理
- 工厂方法:将对象创建责任下放给子类
核心原则:
通过工厂接口获取对象,而非直接依赖具体实现
这种设计体现了面向对象的设计思维,通过抽象和多态实现系统的灵活性和可扩展性。