🧰
一句话理解:抽象工厂提供一组创建方法,用来生成彼此匹配的产品族,而调用方无需知道具体产品类。

核心问题:保证产品族一致

假设游戏有森林和沙漠两套主题,每套都包含敌人、地表和环境音。调用方若分别选择三个具体对象,很容易混搭。抽象工厂把“一整套兼容产品”绑定在同一个工厂中。

模式角色

  • Abstract Factory:声明每种产品的创建方法
  • Concrete Factory:创建同一主题或阵营的产品族
  • Abstract Product:每类产品的共同抽象
  • Concrete Product:具体主题下的产品

Unity 示例:阵营装备工厂

Unity 默认不能直接在 Inspector 中序列化接口字段,因此这里用抽象 ScriptableObject,让配置可视化且类型安全。
客户端只依赖 CampFactory
新增精灵阵营时,只需创建新的产品与 ElfCampFactory,客户端保持不变。

适用场景

  • 阵营装备、职业技能套装
  • 不同主题的 UI 控件
  • 不同平台的输入、存储与支付实现
  • 生物群系的地形、植被和音效组合

权衡

抽象工厂擅长新增“产品族”,却不擅长新增“产品种类”。例如接口增加 CreateMount 后,所有具体工厂都必须实现它。只有当产品之间确实需要配套,且产品类别相对稳定时才值得使用。

与工厂方法的区别

工厂方法通常聚焦一个产品的创建变化;抽象工厂协调多个相关产品。抽象工厂内部也经常使用多个工厂方法。

小结

选择抽象工厂的关键问题是:系统是否需要成套替换一组兼容对象。若答案只是“想少写几个 Instantiate”,使用普通工厂会更简单。