一句话理解:工厂方法把“创建哪种具体对象”的决定延迟给子类或具体工厂,让使用方只依赖抽象产品。
它解决什么问题
当对象的创建不仅是
new,还包含 Prefab 选择、依赖注入、初始化和对象池策略时,把这些细节散落在调用方会产生大量分支。工厂方法把变化集中到创建者一侧。角色
- Product:调用方依赖的产品抽象
- Concrete Product:具体产品
- Creator:声明工厂方法
- Concrete Creator:实现工厂方法并创建具体产品
Unity 示例:敌人工厂
调用方只持有
EnemyFactory:把 Inspector 中的工厂资产换成另一种实现,就能切换敌人和创建流程,
WaveSpawner 无需修改。与其他工厂的区别
- 简单工厂:一个方法通过枚举或分支创建多种产品;简单,但新增类型通常要修改分支。
- 工厂方法:每个具体工厂负责一种产品或创建策略;新增实现通常不改调用方。
- 抽象工厂:一次提供一组相互匹配的产品,例如同一阵营的武器、护甲和坐骑。
什么时候用
适合创建过程会变化、产品需要统一接口、调用方不应依赖具体类的场景。若对象只有一种实现且创建逻辑稳定,直接序列化 Prefab 引用通常更清楚。
优缺点
优点:创建与使用解耦,便于替换、测试和接入对象池。
代价:类和资产数量增加;若每种产品只有一行实例化逻辑,抽象可能得不偿失。
小结
工厂方法的价值不是消灭
new 或 Instantiate,而是把创建策略放到正确的变化边界中。