特定の種類のオブジェクトの大部分を必要とするときにフライウェイトを使用します。彼らは共通のデータ(本質的な状態)を共有するので、メモリ消費を減らすのに役立ち、また、他のすべてのオブジェクトの間で共有されていない独自の状態(外部状態)を持ちます。ここでのサンプルコードは、私はサイズが固有と座標(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]
それに相当するオブジェクトを作成し、異なるオブジェクトに保管するために従いますが、それらはすべて、彼らが自分自身のデータ(外因性の状態を)持っているか、同じ状態またはデータを持っているように出力されますか?
ShapeFactoryのコードを表示してください。 –
フライウェイはこれに適していますか?さまざまな状態(つまり座標)の「円」オブジェクトをたくさん作成したいとします。フライウェイトは共有された状態(つまり色)にのみ適用できます。フライウェイトオブジェクトを変更可能な状態に接続するには、別のシェイプインスタンスを用意する必要があります。 – sisyphus
ありがとう@sisyphus私はあなたのポイントを得る、私はフライ級について間違っていた。色は共有状態であり、フライウェイトは 'color'だけを保存し、@ Glenner003 writeと同じ色オブジェクトで' circle'の新しいオブジェクトが作成されるたびに保存されます。 – user464