1

(フライウェイトを読んでいるときにこの例を見つけました)
ゲームにソルジャーと呼ばれるオブジェクトがあり、このオブジェクトはその場所だけが異なると仮定しましょう。
私の質問は
、このオブジェクトでフライウェイトパターンを使用するかどうかです。ゲーム中に何度も兵士を取得し、各兵士に独自の場所を持たせたい.
どうすればそれを処理できますか?

4

2 に答える 2

4

ええ、私は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クラスのインスタンスが複数ある可能性があります。兵士は、大量のリソースデータへのアクセスを提供しない限り、「何もする」ことはできません。

于 2012-01-08T21:40:11.097 に答える
1

すべての兵士が大量の共有データを含んでいる場合、フライウェイトの設計パターンは役に立ちます。たとえば、兵士と民間人がいるとします。それぞれに異なる 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 のいずれかを指します。

于 2012-01-08T21:05:35.127 に答える