ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Memento

直訳すると「記念品」「思い出」という意味。今の状態を保存しておいて、復帰できるようにする。
ゲームで言えばセーブ。今のプレイ状況を保存しておくこと。
以下、プレイヤーデータのHPとMPを保存して復帰する簡単なサンプル。

// セーブデータ(Memento役、記念品) SaveData.java
package player;

public class SaveData {
    int hp;
    int mp;
    SaveData(int hp, int mp) {
        this.hp = hp;
        this.mp = mp;
    }
}
// プレイヤーデータ(Originator役、作成者) Player.java
package player;

public class Player {
    private int hp;
    private int mp;
    public Player(int hp, int mp) {
        this.hp = hp;
        this.mp = mp;
    }
    // セーブデータを作る
    public SaveData createSaveData() {
        SaveData data = new SaveData(hp, mp);
        return data;
    }
    // セーブデータを読み込んで復帰
    public void restoreSaveData(SaveData data) {
        this.hp = data.hp;
        this.mp = data.mp;
    }
    // HPとMPを変更
    public void setHpMp(int hp, int mp) {
        this.hp = hp;
        this.mp = mp;
    }
    // 文字列表現
    public String toString() {
        return "HP=" + hp + " MP=" + mp; 
    }
}
// テストメイン(Caretaker役、世話をする人) Main.java
import player.Player;
import player.SaveData;

public class Main {
    public static void main(String[] args) {
        Player player = new Player( 100, 50 );
        System.out.println( player );
        // データセーブ
        SaveData save = player.createSaveData();
        // HP,MPを変更
        player.setHpMp( 50, 25 );
        System.out.println( player );
        // セーブデータで復帰
        player.restoreSaveData( save );
        System.out.println( player );
    }
}

実行結果

HP=100 MP=50
HP=50 MP=25
HP=100 MP=50

SaveDataクラスとPlayerクラスはplayerパッケージに入っており、SaveDataクラスのコンストラクタにはpublicが付いていないため、MainからSaveDataのインスタンスを作成することは出来ない。もちろんメンバ変数にもアクセスできない。MainからはPlayerのインスタンスのメソッドを使ってのみSaveDataのインスタンスを取得できる。
このようにすることによってセーブする内容が変わっても、Mainクラスは変更する必要がない。また、複数のセーブデータを持ちたい場合には、SaveDataクラスやPlayerクラスを変更する必要がない。
このようにCaretaker(世話をする人)役とOriginator(作成者)役を分けることが重要。


参考文献:(旧版)Java言語で学ぶデザインパターン入門
参考:ギコ猫とMementoパターン