← 返回题目列表

备忘录模式和原型模式有什么区别?

高频 中等 第 2 / 25 题 更新于 2026/08/02
备忘录模式原型模式快照克隆

简化版

原型模式关注通过克隆创建新对象,解决对象创建成本和复制问题;备忘录模式关注保存和恢复对象历史状态,解决撤销、回滚和存档问题。备忘录可能用克隆实现快照,但目的不是创建新业务对象。

详细版

原型模式:

  • 重点是对象复制。
  • 用 clone 创建新对象。
  • 适合创建成本高或对象结构复杂的场景。
  • 关注深拷贝、浅拷贝、复制构造。

备忘录模式:

  • 重点是状态保存和恢复。
  • Memento 保存历史状态。
  • 适合撤销、回滚、存档。
  • 关注封装、历史管理、内存成本。

两者可能都涉及复制,但动机不同:原型是为了创建对象,备忘录是为了恢复状态。

完整版教学

一、原型模式的核心是创建

原型模式解决的是对象创建问题。当一个对象创建过程复杂,或希望基于已有对象复制出新对象时,可以用原型模式。

它回答的问题是:如何快速得到一个相似的新对象?

二、备忘录模式的核心是恢复

备忘录模式解决的是状态历史问题。它保存对象某一刻状态,用于未来恢复。

它回答的问题是:如何在不破坏封装的情况下回到过去状态?

三、为什么容易混淆

备忘录可以通过深拷贝保存快照,看起来像克隆对象。但 Memento 通常不是给业务直接使用的新对象,而是历史状态载体。

原型模式复制出来的新对象通常参与业务运行;备忘录对象通常由 Caretaker 保存,需要时交给 Originator 恢复。

四、常见误区与工程判断

如果需求是“复制一份配置模板生成新配置”,更像原型模式。如果需求是“修改配置前保存一份,失败后恢复”,更像备忘录模式。

工程中可以用原型模式作为备忘录的底层实现,但不要混淆设计意图。设计模式分类看目的,不只看代码长相。

五、复制对象和保存快照不是同一个目标

原型模式强调通过复制已有对象创建新对象,重点是对象创建效率和创建方式;备忘录模式强调保存对象某一时刻的状态,重点是以后能恢复。二者都可能用到拷贝,但设计意图完全不同。

例如有一个游戏角色对象,原型模式关心“如何快速复制一个新角色模板”;备忘录模式关心“这个角色在第 10 分钟的血量、装备、位置如何保存,之后能不能回到这个状态”。前者服务创建,后者服务回滚。

面试时可以从所有权角度区分:原型复制出来的新对象通常由调用方正常使用和修改;备忘录里的状态不应该被 Caretaker 随便改,它是恢复用的历史记录。只要讲清“创建对象”和“恢复状态”的目标差异,就不会混淆。

从生命周期看,原型复制出来的对象会进入正常业务流程,可能长期存在;备忘录快照通常由历史管理器保存,只在恢复时被 Originator 使用。一个面向“未来继续使用”,一个面向“必要时回到过去”,语义完全不同。

代码形态上,原型模式通常暴露 clone 或复制工厂;备忘录模式通常暴露 saverestore。方法命名背后就是意图差异:一个是复制出新对象,一个是保存并恢复旧状态。

六、用工程约束检验答案

原型的输出是可继续独立使用的新对象,备忘录的输出是供原发器恢复的历史状态。复制一个含 20 个字段的订单作为新订单属于 Prototype;保存其中恢复所需的 8 个字段并交给原订单 restore 属于 Memento。

检查项核心判断工程含义
Prototype创建同类新实例调用方通常使用副本
Memento保存恢复状态Caretaker 不解释内容
复制技术二者都可能深拷贝相同手段不代表相同意图

把关键关系压缩成一条可复述的路径:

clone -> 新业务对象继续工作
save -> 不透明历史快照
restore(snapshot) -> 原对象回到历史
看生命周期即可区分

模式按设计意图区分,不按是否调用 clone 或复制字段来区分。

落地前可以再按下面 3 步复核:

  1. 先说明“Prototype”的核心机制:创建同类新实例;再交代边界:调用方通常使用副本。
  2. 接着分析“Memento”:保存恢复状态;不能遗漏对应代价或结果:Caretaker 不解释内容。
  3. 最后用“复制技术”检查方案:二者都可能深拷贝;验收时确认相同手段不代表相同意图。

这三项构成完整判断链:先讲清Prototype,再说明Memento,最后用复制技术检验实现是否越界。

面试中若能给出违反“相同手段不代表相同意图”的反例,再说明修正办法,答案就从模式定义落到了可验证的工程决策。

七、常见误区与追问

  • 误区:只看到“Prototype”就认为方案成立。 必须同时说明核心机制“创建同类新实例”和工程边界“调用方通常使用副本”。
  • 误区:把“Memento”当成无条件结论。 只有在“保存恢复状态”成立时,才能据此讨论“Caretaker 不解释内容”。
  • 追问:Memento 能用 Prototype 实现吗? 可以借助复制生成快照,但仍要维持保存、保管、恢复的角色边界。
  • 追问:原型副本能用于撤销吗? 能作为实现手段,但若缺少封装的恢复协议就不是完整备忘录结构。
  • 追问:二者都要求深拷贝吗? 不要求,是否深拷贝取决于可变引用和隔离需求。
  • 追问:谁使用产物? 原型副本由业务客户端使用,Memento 主要交回 Originator 恢复。
  • 追问:最大的面试区分点是什么? Prototype 解决创建成本,Memento 解决历史恢复。

八、加强记忆

记忆时抓住这条主线:原型模式为创建新对象;备忘录模式为保存和恢复状态;备忘录可能使用克隆,但目的不是克隆;判断模式要看意图,不只看实现。面试回答先给出模式意图,再用调用链或数据流说明角色协作,最后主动交代适用边界与工程代价。