一句话理解:原型模式通过复制一个已经配置好的对象来创建新对象,适合构造成本高、配置复杂或运行时需要保留快照的场景。
核心思想
客户端不必知道对象如何一步步构造,只需要拿到一个原型并调用克隆操作。GoF 结构通常包含:
- Prototype:声明克隆能力
- Concrete Prototype:决定复制哪些字段
- Client:选择原型并创建副本
Unity 的 Prefab 和
Object.Instantiate 体现了相同思想:Prefab 是预先配置的原型,实例化得到独立的场景对象。C# 示例:复制技能运行时数据
复制构造函数明确控制复制策略,通常比
MemberwiseClone 更容易审查。修改
empowered.Effects 不会影响原型,因为列表被重新创建。深拷贝与浅拷贝
- 浅拷贝:值类型被复制,引用类型仍指向同一对象。
- 深拷贝:需要独立变化的引用对象也会被复制。
并非所有引用都应深拷贝。材质模板、只读配置和资源引用常常应该共享;生命值、效果列表等运行时状态通常应该独立。复制策略应由业务语义决定。
Unity 中的实践
这能复制 Prefab 的组件和序列化数据,但频繁生成子弹、特效时仍会产生创建与销毁成本。原型模式负责“从什么复制”,对象池负责“如何复用”,两者可以组合。
ScriptableObject 也可作为配置原型;若运行时会修改数据,应先 Instantiate(configAsset),避免污染项目资产。适用与边界
适合复杂配置模板、关卡片段、技能变体、编辑器工具和运行时快照。不适合字段很少、构造过程简单,或对象包含难以复制的外部资源句柄时。
小结
原型模式的难点不在调用
Clone,而在定义清晰的所有权:哪些数据共享,哪些数据必须独立。先写明复制策略,才能避免隐蔽的状态串改。