コンテンツにスキップ

Memento

オブジェクト内部状態をカプセル化したスナップショットとして保存・復元するパターンです。

  • チェックポイント復帰を実装するとき
  • Undo / Redo をサポートするとき
  • Originator
  • Memento
  • Caretaker

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using System.Collections.Generic;
using UnityEngine;
public readonly struct PlayerStateSnapshot
{
public readonly Vector3 Position;
public readonly int Health;
public PlayerStateSnapshot(Vector3 position, int health)
{
Position = position;
Health = health;
}
}
public sealed class PlayerStateHistory
{
private readonly Stack<PlayerStateSnapshot> snapshots = new();
public void Save(PlayerStateSnapshot snapshot) => snapshots.Push(snapshot);
public bool TryRestore(out PlayerStateSnapshot snapshot) => snapshots.TryPop(out snapshot);
}
  • 内部詳細を公開せずに状態保存・復元ロジックを切り離せます。
  • チェックポイントや履歴系システムと相性が良いです。
  • 状態が大きいとスナップショットデータも急激に増えます。
  • 復元タイミングを明確にしないと同期バグが起きやすくなります。

元の状態をスナップショットとして保存し、必要時に復元する流れです。

Memento の流れ