🧬
一句话理解:原型模式通过复制一个已经配置好的对象来创建新对象,适合构造成本高、配置复杂或运行时需要保留快照的场景。

核心思想

客户端不必知道对象如何一步步构造,只需要拿到一个原型并调用克隆操作。GoF 结构通常包含:
  • Prototype:声明克隆能力
  • Concrete Prototype:决定复制哪些字段
  • Client:选择原型并创建副本
Unity 的 Prefab 和 Object.Instantiate 体现了相同思想:Prefab 是预先配置的原型,实例化得到独立的场景对象。

C# 示例:复制技能运行时数据

复制构造函数明确控制复制策略,通常比 MemberwiseClone 更容易审查。
修改 empowered.Effects 不会影响原型,因为列表被重新创建。

深拷贝与浅拷贝

  • 浅拷贝:值类型被复制,引用类型仍指向同一对象。
  • 深拷贝:需要独立变化的引用对象也会被复制。
并非所有引用都应深拷贝。材质模板、只读配置和资源引用常常应该共享;生命值、效果列表等运行时状态通常应该独立。复制策略应由业务语义决定。

Unity 中的实践

这能复制 Prefab 的组件和序列化数据,但频繁生成子弹、特效时仍会产生创建与销毁成本。原型模式负责“从什么复制”,对象池负责“如何复用”,两者可以组合。
ScriptableObject 也可作为配置原型;若运行时会修改数据,应先 Instantiate(configAsset),避免污染项目资产。

适用与边界

适合复杂配置模板、关卡片段、技能变体、编辑器工具和运行时快照。不适合字段很少、构造过程简单,或对象包含难以复制的外部资源句柄时。

小结

原型模式的难点不在调用 Clone,而在定义清晰的所有权:哪些数据共享,哪些数据必须独立。先写明复制策略,才能避免隐蔽的状态串改。