0

私はhttp://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.htmlSOLDIERで Flyweight サンプル コードを調べていて、静的インスタンス (上記のサイトのように) を割り当てると実際にどのように機能するのか疑問に思いました) で非静的な兵士のインスタンスに変換するSoldierClientと、オブジェクトのサイズを実際に縮小できSoldierClientますか?SOLDIERSoldierClient

編集:

それが言う方法moveSoldier() では

// 前の場所から兵士の表現を削除します
// その後、新しい場所で兵士の表現をレンダリングします

これがクラスで作成されたすべてのオブジェクトに影響しないのはなぜですかWarGame

package flyweight;

public class SoldierImp implements Soldier {

    /**
     * Intrinsic State maintained by flyweight implementation
     * Solider Shape ( graphical represetation)
     * how to display the soldier is up to the flyweight implementation
     */
    private Object soldierGraphicalRepresentation;

    /**
     * Note that this method accepts soldier location 
     * Soldier Location is Extrinsic and no reference to previous location 
     * or new location is maintained inside the flyweight implementation
     */
    public void moveSoldier(int previousLocationX, int previousLocationY,
            int newLocationX, int newLocationY) {

        // delete soldier representation from previous location 
        // then render soldier representation in new location   
    }
4

3 に答える 3

3

Aは のコピーSoldierClient保持せず、 への参照を保持し、すべてが同じへの参照を保持します。SOLDIERSOLDIER SoldierClient SOLDIER

編集に答える

各兵士の位置は、SoldierClientインスタンス (currentLocationXおよびcurrentLocationYプロパティ) に保持されます。これらのプロパティのコード コメントにも、「この状態はクライアントによって維持されます」(つまり、「この状態はSoldierImpインスタンスでは維持されない」) と書かれています。

すべてがmoveSoldierのパラメータにありSoldierImpます。インスタンスの状態はありません。静的ユーティリティ メソッドのように考えてください。座標はSoldierClientインスタンスによって提供されます。SoldierImp--just usedによって保存されることはありません。

于 2011-10-18T01:41:38.310 に答える
1

ドキュメントに記載されているように:

解決策は、兵士の共通の状態を共有オブジェクトに保持することです

実際、すべての SolderClient には、コピーではなく SOLDIER への参照があります。すべての SolderClient で、変数Soldier 兵士は 1 つのオブジェクトのみを参照し、すべてのクライアントで同じです。

Flyweight パターンは Singleton パターンを使用するため、最初に確認できます。

http://www.oodesign.com/singleton-pattern.html

于 2011-10-18T01:41:49.313 に答える
1

各 SoldierClient インスタンスには、Soldier オブジェクトへの参照があります。この場合、それらはすべて同じインスタンスを指しています。SoldierFactory を呼び出すたびに、同じ Soldier オブジェクトが返されることに気付くでしょう。Soldier のコンストラクターの呼び出しは 1 つだけです。

シングルトンも参照

于 2011-10-18T01:45:06.490 に答える