2016-05-04 6 views
0

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

folgen
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?

+0

Bitte zeigen Sie den Code Ihrer ShapeFactory. –

+1

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

+0

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

Antwort

2

Fliegengewicht Objekte sollten unveränderlich sein.

In Ihrem Beispiel könnten Sie den wiederverwendeten Teil (Farbe/Größe, Ihre Beispiele Konflikt) in einer separaten Klasse und verwenden Sie das als ein Fliegengewicht verzweifelt.

Dann würden Sie einen neuen Kreis für jeden Ort instanziieren, aber das Farbobjekt wiederverwenden.

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

Können Sie auf eine Quelle für die Anweisung "_Flyweight objects sollte unveränderlich_" verweisen? Ich stimme dir zu; aber ich bin neugierig, ob es etwas ist, was du gelesen hast oder nur eine Meinung. – jaco0646

+0

Danke @ Glenner003, jetzt verstehe ich Fliegengewicht sollte nur mit (speichern) gemeinsamen Objekt beschäftigen, die in unserem Fall ist "Farbe" und jedes Mal sollte neues Objekt von 'circle' mit gemeinsamen' color' Objekt erstellen. Ich habe [diese] (http://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm) Beispiel verfolgt, können Sie sich das ansehen? Ich denke dann falsch. – user464

+0

@ jaco0646 Ich habe es wahrscheinlich einmal irgendwo gelesen, aber ich weiß nicht mehr wo. Wikipedia bestätigt dies jedoch: https://en.wikipedia.org/wiki/Flyweight_pattern#Immutability_and_equality – Glenner003