(フライウェイトを読んでいるときにこの例を見つけました)
ゲームにソルジャーと呼ばれるオブジェクトがあり、このオブジェクトはその場所だけが異なると仮定しましょう。
私の質問は
、このオブジェクトでフライウェイトパターンを使用するかどうかです。ゲーム中に何度も兵士を取得し、各兵士に独自の場所を持たせたい.
どうすればそれを処理できますか?
2 に答える
ええ、私はpatherosに同意します...しかし、 Flyweightパターンを使用するインセンティブには、追加のクラス構造は必要ないことを指摘したいと思います。インセンティブは、Flyweightパターンを使用することで、一般的な/重いリソースの使用を最小限に抑えることです。
すべての兵士が同じグラフィック表現を使用するとします。各兵士がグラフィカルデータ(つまり、実装の一般的な「重い」側面)をインスタンス化するのではなく、すべての兵士が共有する1つの「テンプレート」オブジェクトを作成します。
class SharedSoldierData {
/** UI representation, big, and common to all. */
byte[] bitmap;
}
class Soldier {
int x,y;
void doMovement(SharedSoldierData extraData) {
// In order to move, this method needs the 'UI' information (a bitmap), which must be provided.
}
}
// example usage:
SharedSoldierData soldierType = new SharedSoldierData(...); // setup with the soldiers bitmap
Soldier soldier1 = new Soldier();
Soldier soldier2 = new Soldier();
// modify the solider x/y locations as the game progresses...
soldier1.doMovement(soldierType); // move soldier 1
soldier2.doMovement(soldierType); // ditto for soldier 2.
SharedSoldierDataクラスのインスタンスは1つだけです(重いリソースのインスタンスが1つ、この場合はビットマップ)が、Soldierクラスのインスタンスが複数ある可能性があります。兵士は、大量のリソースデータへのアクセスを提供しない限り、「何もする」ことはできません。
すべての兵士が大量の共有データを含んでいる場合、フライウェイトの設計パターンは役に立ちます。たとえば、兵士と民間人がいるとします。それぞれに異なる maxHP、attackSpeed、および damage がありますが、すべての兵士がこれらの属性を共有しています。その場合、次のようにします。
class UnitTemplate {
String name;
int maxHP;
int attackSpeed;
int damage;
}
class Unit{
UnitTemplate template;
int x;
int y;
}
UnitTemplate には 2 つのインスタンスがあり、1 つは兵士タイプのユニット用で、もう 1 つは民間タイプのユニット用です。任意の数の Unit インスタンスが存在する可能性があり、それぞれが兵士の UnitTemplate または民間の UnitTemplate のいずれかを指します。