🏭
一句话理解:工厂方法把“创建哪种具体对象”的决定延迟给子类或具体工厂,让使用方只依赖抽象产品。

它解决什么问题

当对象的创建不仅是 new,还包含 Prefab 选择、依赖注入、初始化和对象池策略时,把这些细节散落在调用方会产生大量分支。工厂方法把变化集中到创建者一侧。

角色

  • Product:调用方依赖的产品抽象
  • Concrete Product:具体产品
  • Creator:声明工厂方法
  • Concrete Creator:实现工厂方法并创建具体产品

Unity 示例:敌人工厂

调用方只持有 EnemyFactory
把 Inspector 中的工厂资产换成另一种实现,就能切换敌人和创建流程,WaveSpawner 无需修改。

与其他工厂的区别

  • 简单工厂:一个方法通过枚举或分支创建多种产品;简单,但新增类型通常要修改分支。
  • 工厂方法:每个具体工厂负责一种产品或创建策略;新增实现通常不改调用方。
  • 抽象工厂:一次提供一组相互匹配的产品,例如同一阵营的武器、护甲和坐骑。

什么时候用

适合创建过程会变化、产品需要统一接口、调用方不应依赖具体类的场景。若对象只有一种实现且创建逻辑稳定,直接序列化 Prefab 引用通常更清楚。

优缺点

优点:创建与使用解耦,便于替换、测试和接入对象池。
代价:类和资产数量增加;若每种产品只有一行实例化逻辑,抽象可能得不偿失。

小结

工厂方法的价值不是消灭 newInstantiate,而是把创建策略放到正确的变化边界中。