Wir verwenden Fliegengewicht, wenn es notwendig ist, Masse einer bestimmten Art von Objekt zu kisten. Weil sie sich gemeinsame Daten teilen (intrinsischer Zustand), hilft dies bei der Reduzierung des Speicherverbrauchs und haben auch ihren eigenen Zustand (extrinsischer Zustand), der nicht von allen anderen Objekten gemeinsam genutzt wird. Hier ist ein BeispielcodeProblem mit Fliegengewicht Muster
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);
}
}
und der Fahrer
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);
}
}
In diesem Beispiel i Größe intrinsische sein will und die Koordinaten (x, y) extrinsische zu sein, aber, wenn überhaupt i die Koordinaten first_circle
verändern es spiegelt auch die Änderung in second_circle
wider, da sie ein komplettes Objekt und nicht nur einen einzelnen Zustand teilen. Der Ausgang ist als
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]
sein Äquivalent ein Objekt zu erstellen und speichern sie in verschiedenen Objekten, aber sie alle haben den gleichen Status oder die Daten dann, wie sie ihre eigenen Daten (extrinsische Zustand) haben?
Bitte zeigen Sie den Code Ihrer ShapeFactory. –
Sind Sie sicher, dass das Fliegengewicht dafür geeignet ist? Sie möchten viele 'Kreis'-Objekte mit unterschiedlichen Zuständen (z. B. Koordinaten) erstellen. Fliegengewicht kann dann nur auf den gemeinsamen Zustand angewendet werden (d. H. Farbe) - Sie müssen immer noch separate "Form" -Instanzen haben, um das Fliegengewichtobjekt mit dem veränderbaren Zustand zu verbinden. – sisyphus
Dank @sisyphus Ich verstehe deinen Punkt, ich war falsch über Fliegengewicht. Farbe ist ein gemeinsamer Zustand, dann sollte Fliegengewicht nur "Farbe" speichern und jedes Mal, wenn ein neues Objekt von "Kreis" mit demselben Farbobjekt erstellt wird, wie @ Glenner003 schreibt. – user464