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

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

Flyweight

インスタンスを共有して無駄をなくす。Flyweightとは「フライ級」のこと。
同じように使いまわせるインスタンスは無駄にnewせずに、最初に作成したものを共有してリソースを節約する。
ゲームではモデルデータやテクスチャデータの扱いにこのFlyweightパターンを使うことが多いだろう。

// モデルデータ管理クラス
public class ModelDataManager {
    private Hashtable pool = new Hashtable();

    public ModelData getModelData(String modelname) {
        ModelData md = (ModelData)pool.get(modelname);
        if (md == null) {
            md = new ModelData(modelname);
            pool.put(modelname, md);
        }
        return md;
    }
}

// 使用例
ModelDataManager modeldatamanager;

void doTest {
    ModelData myShip = modeldatamanager.getModelData("myShip");
}

※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
モデルデータを管理するクラスを用意し、これをsingletonとしてプログラムの実行中にインスタンスを1つ用意しておく。モデルデータが必要なときはこのインスタンス経由でモデルデータを取得するようにする。
getModelData()でモデルデータを要求されたら、すでにnewしていないかチェックし、すでにnewしてあるならそれを返し、もしnewしてなかったら新たにnewして返す。上の例ではnewしたインスタンスをハッシュテーブルで管理している。


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