2011-10-18 8 views
0

私はhttp://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.htmlでFlyweightサンプルコードを調べて、静的インスタンス(上記のサイトのようにSOLDIER)を非静的な兵士に割り当てたときの実際の動作を疑問視していましたインスタンスSoldierClientの場合、それぞれSoldierClientは、SoldierClientオブジェクトにSOLDIERインスタンスのコピーを何らかの形で保持するため、実際にオブジェクトサイズを小さくしますか?Flyweightパターンで静的インスタンスを静的インスタンスに割り当てる

EDIT:メソッドで

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 
    } 

答えて

3

SoldierClientSOLDIERコピーを保持していない、それはSOLDIERから参照を保持しており、すべてのSoldierClient同じSOLDIERへの参照を保持しています。

各兵士の場所がSoldierClientインスタンス(currentLocationXcurrentLocationYプロパティ)で開催された編集に答える

。これらのプロパティのコードコメントは、「この状態はクライアントによって維持されます(つまり、「この状態はSoldierImpインスタンスでは維持されません」)。

すべてがmoveSoldierのパラメータにあります。SoldierImpインスタンスの状態はありません。静的なユーティリティメソッドのように考えてください。座標はSoldierClientインスタンスによって提供されます。彼らはSoldierImpによって決して保存されません - それはちょうど使用されました。

+0

1を参照してください、私の混乱が、ここで我々は、参照のプロパティを変更した場合、IS、それはまた、静的な対応に反映すべきであるが、この場合にはそうではないのですか? – coder9

+0

@ coder9リンクするコードは決して参照のプロパティを変更しません。実際には参照*にはプロパティがありません。 –

+0

質問は上記のように編集されました。ありがとうございました – coder9

1

ドキュメントが言及したよう:

ソリューションを共有 オブジェクト

で兵士の一般的な状態を維持することです本当にすべてのSolderClientはSOLDIERへの参照ではないコピーを持っています。すべてのSolderClientでは、変数のSoldier Soldierは、1つのオブジェクトantのみを参照しています。すべてのクライアントで同じです。 Flyweightパターンは、Singletonパターンを使用しているので

多分あなたはそれを最初にチェックすることができます。

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

1

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

Singleton