2016-05-04 13 views
0

特定の種類のオブジェクトの大部分を必要とするときにフライウェイトを使用します。彼らは共通のデータ(本質的な状態)を共有するので、メモリ消費を減らすのに役立ち、また、他のすべてのオブジェクトの間で共有されていない独自の状態(外部状態)を持ちます。ここでのサンプルコードは、私はサイズが固有と座標(x、y)になりたいフライウェイトパターンで問題がある

public abstract class Shape { 

    private String color; 
    private int x; 
    private int y; 

    public Shape(String color) { 
     super(); 
     this.color = color; 
    } 

    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    public abstract String draw(); 

    @Override 
    public String toString() { 
     return "[color=" + color + ", x=" + x + ", y=" + y + "]"; 
    } 


} 


public class Circle extends Shape { 

    public Circle(String color) { 
     super(color); 
    } 

    @Override 
    public String draw() { 
     // TODO Auto-generated method stub 
     return "Circle " + toString(); 
    } 

} 

import java.util.HashMap; 

public class ShapeFactory { 

    private static HashMap<String, Shape> circle_map = new HashMap<>(); 

    public static Shape getCircle(String size){ 
     if(!circle_map.containsKey(size)) 
      circle_map.put(size, new Circle(size)); 

     return circle_map.get(size); 
    } 

} 

この例では、ドライバ

public class ShapeDriver { 

    public static void main(String[] args) { 

     Shape first_circle = ShapeFactory.getCircle("small"); 
     first_circle.setX(45); 
     first_circle.setY(12); 
     Shape second_circle = ShapeFactory.getCircle("small"); 

     System.out.println("First circle" + first_circle); 
     System.out.println("Second circle" + second_circle); 

     second_circle.setX(62); 
     second_circle.setY(23); 

     System.out.println("First circle" + first_circle); 
     System.out.println("Second circle" + second_circle); 
    } 

} 

ある外因性であることが、ときに私はfirst_circleの座標を変更し、これまでsecond_circleの変更も反映されます。これは、単一の状態だけでなく、完全なオブジェクトを共有しているためです。

First circle[color=small, x=45, y=12] 
Second circle[color=small, x=45, y=12] 
First circle[color=small, x=62, y=23] 
Second circle[color=small, x=62, y=23] 

それに相当するオブジェクトを作成し、異なるオブジェクトに保管するために従いますが、それらはすべて、彼らが自分自身のデータ(外因性の状態を)持っているか、同じ状態またはデータを持っているように出力されますか?

+0

ShapeFactoryのコードを表示してください。 –

+1

フライウェイはこれに適していますか?さまざまな状態(つまり座標)の「円」オブジェクトをたくさん作成したいとします。フライウェイトは共有された状態(つまり色)にのみ適用できます。フライウェイトオブジェクトを変更可能な状態に接続するには、別のシェイプインスタンスを用意する必要があります。 – sisyphus

+0

ありがとう@sisyphus私はあなたのポイントを得る、私はフライ級について間違っていた。色は共有状態であり、フライウェイトは 'color'だけを保存し、@ Glenner003 writeと同じ色オブジェクトで' circle'の新しいオブジェクトが作成されるたびに保存されます。 – user464

答えて

2

フライウェイトオブジェクトは不変である必要があります。

例では、別のクラスで再利用された部分(色/サイズ、例が矛盾している)を欲しがり、それをフライウェイトとして使用することができます。

次に、場所ごとに新しいサークルをインスタンス化しますが、カラーオブジェクトを再利用します。

public class Color { 
    String color; 
    public (String color) { 
     this.color = color; 
    } 
    ... 
}  

public abstract class Shape { 

     private Color color; 
     private int x; 
     private int y; 

     public Shape(Color color) { 
      super(); 
      this.color = color; 
     } 
     ...  
    } 


    public class Circle extends Shape { 

     public Circle(Color color) { 
      super(Color); 
     } 

     ...  
    } 


    public class ShapeFactory { 

     private static HashMap<String, Color> color_map = new HashMap<>(); 

     public static Shape getCircle(String color){ 
      if(!color_map.containsKey(color)) 
       color_map .put(color, new Color(color)); 

      return new Circle(color_map.get(size)); 
     } 

    } 
+0

"_Flyweightオブジェクトは不変であるはずです"という文のソースを参照できますか?仰るとおりです;しかし、あなたが読んだものであれ、意見であれ、私は興味があります。 – jaco0646

+0

ありがとう@ Glenner003、私はフライウェイトは私たちのケースでは 'カラー'である共有オブジェクトを扱うべきであると理解しており、毎回、共有された 'color'オブジェクトで' circle'の新しいオブジェクトを作成する必要があります。私は[this](http://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm)の例に従っていましたが、これを見てみることはできますか?私はそれが間違っていると思う。 – user464

+0

@ jaco0646私はたぶんどこかでそれを読んでいましたが、私はどこを思い出していません。しかし、ウィキペディアはこれを確認しています:https://en.wikipedia.org/wiki/Flyweight_pattern#Immutability_and_equality – Glenner003