インスタンスを共有して無駄をなくす。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