【めめんとぱたーん】

Mementoパターン とは?

最終更新:
💡 内部状態を隠したまま、保存して戻す

内部状態を外部に公開せず保存し、後で復元できるようにするデザインパターン。Originator・Memento・Caretaker、Undoとの関係、保存範囲と負担を解説します。

📌 このページのポイント
Memento:保存物の中身と管理を分けるOriginator状態の持ち主保存・復元するCaretaker保存物を管理中身を直接変えないMemento保存時点の内部状態作る保管戻す:保存物を渡し、持ち主が復元外部への送信等まで自動では取り消せない
図形エディタの変更前の状態を残すような用途です。必要な状態を保存時点のまま保ち、履歴や保存範囲、資源の負担は別に設計します。
ひよこ ひよこ
変更する前の状態に、戻したい!
ペンギン先生 ペンギン先生
Mementoパターンは、オブジェクトの内部状態を保存し、あとで復元できるようにする設計だよ。図形エディタで変更前の状態を残し、Undoで戻すような用途がある。保存物がスナップショットに当たるんだ。
ひよこ ひよこ
誰が、状態を保存する?
ペンギン先生 ペンギン先生
状態を持つOriginatorが、自分の状態からMementoを作るよ。Caretakerは、いつ保存や復元が必要かを管理し、保存物を保管する。復元するときは、保存物をOriginatorに渡して戻してもらうんだ。
ひよこ ひよこ
Caretakerが、中の値を直してもよい?
ペンギン先生 ペンギン先生
内部状態を直接読んだり書き換えたりせず、Originatorに任せるのが要点だよ。保存の中身と、その管理を分けてカプセル化を保つ。どんな情報を保存し、誰から触れるようにするかは、言語や実装で決めるんだ。
ひよこ ひよこ
参照を一つ保存するだけでよい?
ペンギン先生 ペンギン先生
同じ変更可能なオブジェクトを参照しているだけだと、変更前の値も変わってしまうことがあるよ。保存時点の必要な状態を保てるようにする。値のコピーや変更しない構造など、状態の持ち方に合う方法を設計しよう。
ひよこ ひよこ
保存すれば、何でも元に戻る?
ペンギン先生 ペンギン先生
保存したオブジェクトの状態が対象だよ。メールの送信や、別のオブジェクト、外部の資源への影響まで自動で取り消せるわけではない。大きな状態を何度も保存すると資源も使うので、保存範囲と履歴の管理が大切なんだ。
もっと詳しく知りたい人へ

Mementoを作るだけで、Redoも完成する?

変更後の状態も残す、履歴の現在位置を管理する、Undo後の新しい操作でどの履歴を残すか決める、といった処理が別に必要です。Mementoは状態の保存・復元を支えますが、履歴操作の仕様をすべて決めるものではありません。

ゲームの保存やファイルのバックアップは、全部Memento?

保存して戻す考え方は似ていますが、それだけでは同じパターンとは限りません。内部状態の保存・復元を持ち主に任せ、保存物を管理する側が中身へ直接依存しない、という役割と目的を確認します。ディスクへの永続化も別に設計します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Mementoパターン」って出てきたら「内部状態を隠したまま保存し、あとで戻せるようにする設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Memento Pattern」 = 状態の保存物を使うデザインパターン
💬 Mementoは記念品や思い出の品を指す言葉です。このパターンでは、あとで状態を復元するための保存物を表します。

参考資料

← 用語集にもどる