Latest web development tutorials

Flyweight

Fliegengewicht (Flyweight-Muster) wird hauptsächlich verwendet, um die Anzahl der Objekte zu reduzieren erstellt Speicherverbrauch zu reduzieren und die Leistung zu verbessern. Diese Art von Entwurfsmustern gehören Strukturmodell, das eine Verringerung der Anzahl von Objekten liefert, die die Struktur des Objekts in einer Weise, von der Anwendung benötigt zu verbessern.

Flyweight versuchen bestehende Objekte derselben wieder zu verwenden, wenn das passende Objekt nicht gefunden wird, wird ein neues Objekt erstellt. Wir werden 20 Kreise in verschiedenen Orten durch die Schaffung von fünf Objekte verteilt zeichnen dieses Muster zu demonstrieren. Da nur fünf Arten von Farben zur Verfügung, so dass die Farbe Attribut verwendet wird , ein vorhandenes ObjektCirclezu überprüfen.

Einführung

Intent: Verwenden Sie gemeinsame Nutzung einer großen Anzahl von feinkörniger Objekte zu unterstützen.

Vor allem zu lösen: In einer großen Anzahl von Objekten kann es einen Speicherüberlauf verursachen, haben wir zusammen einen Abschnitt , in dem die abstrakte, wenn Sie die gleiche Serviceanfrage haben direkt zurück vorhandenen Objekte im Speicher, neu erstellt zu vermeiden.

Wenn zu verwenden: 1, hat das System eine große Anzahl von Objekten.2, diese Objekte verbrauchen viel Speicher. 3 kann der Zustand der meisten dieser Objekte externalisierte werden. 4 kann viele dieser Objekte in Gruppen entsprechend der intrinsischen Zustand unterteilt werden, wenn das Objekt von den äußeren Yun Objekte entfernt wird, kann jedes Objekt ein Objekt anstelle eingestellt werden. 5, das System nicht über die Identität dieser Objekte abhängen, werden diese Objekte nicht zu unterscheiden.

Wie zu beheben: mit einem eindeutigen Identifizierungscode analysieren, wenn es im Speicher ist, wird die eindeutige Identifikationscode der identifizierten Objekte zurückgegeben.

Der Schlüsselcode: HashMap mit diesen Objekten gespeichert.

Anwendungsbeispiele: 1, JAVA in String, wenn er zurückgeht , wenn nicht , dann eine Zeichenfolge in der Innenpool String - Puffer gespeichert erstellen.2, die Datenpool-Datenbank.

Vorteile: erheblich die Erstellung von Objekten zu reduzieren, dem Speicher des Systems zu reduzieren, so dass die Effizienz verbessert wird.

Nachteile: Erhöhung der Ladung des Systems, müssen wir die internen und externen Zustand Status und externen Zustand der Natur zu trennen sind von Natur aus nicht mit dem inneren Zustand der Änderung ändern, sonst wird es Chaos - System erstellen.

Nutzungsszenarien: 1, hat das System eine große Anzahl von ähnlichen Objekten.2, müssen Szene zu bündeln.

Anmerkung: 1, achten Sie auf den Zustand der externen und internen Teilung des Staates, oder es kann Thread-Sicherheit zu Problemen führen.2, muss die Klasse ein Factory-Objekt müssen kontrolliert werden.

Realisierung

Wir werden eineFormSchnittstelle und Implementierung des Entity - KlassenKreis-Form- Schnittstelle erstellen. Der nächste Schritt ist die Factory - KlassenShapeFactory definieren.

ShapeFactoryeinenKreisvonHashMap haben,wo der Schlüssel FarbeKreisObjekt mit dem Namen. Jedes Mal, wenn eine Anforderung empfangen wird, wird es eine bestimmte Farbkreis erstellen.ShapeFactoryseineHashMapim Kreis Objekt prüfen, ob gefundenKreisObjekte, wird das Objekt zurückgegeben, andernfalls wird es eine in der hashmap gespeichert schaffen für die spätere Verwendung des neuen Objekts zu erstellen, und das Objekt an den Client zurückgegeben wird.

FlyWeightPatternDemo,unsere Demo zu bekommen die KlasseShapeFactoryShape - Objekt zu verwenden. Es wird Informationen(rot / grün / blau / schwarzübertragen / weiß) zuShapeFactory,braucht es die Farbe des Objekts zu erhalten.

Flyweight Muster UML-Diagramm

Schritt 1

Erstellen Sie eine Schnittstelle.

Shape.java

public interface Form {
   Leere draw ();
}

Schritt 2

Erstellen von Entity-Klasse, die die Schnittstelle implementiert.

Circle.java

public class Kreis implementiert Form {
   private String Farbe;
   private int x;
   private int y;
   private int Radius;

   public Kreis (String Farbe) {
      this.color = Farbe;		
   }

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

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

   public void setRadius (int radius) {
      this.radius = Radius;
   }

   @Override
   public void draw () {
      System.out.println ( "Circle: Draw () [Farbe:" + Farbe 
         + ", X:" + x + ", y" + y + ", Radius:" + Radius);
   }
}

Schritt 3

Erstellen Sie eine Fabrik die Objekt Entitätsklassen auf der gegebenen Informationen beruhen zu erzeugen.

ShapeFactory.java

Import java.util.HashMap;

public class ShapeFactory {
   private static final HashMap <String, Form> circleMap = new HashMap ();

   public static Form getCircle (String Farbe) {
      Kreis Kreis = (Kreis) circleMap.get (Farbe);

      if (Kreis == null) {
         Kreis = new Kreis (Farbe);
         circleMap.put (Farbe, Kreis);
         System.out.println ( "Erstellen Kreis der Farbe:" + Farbe);
      }
      Rückkehr Kreis;
   }
}

Schritt 4

Verwenden Sie die Fabrik eine Entität Objekt der Klasse zu erhalten, indem die Farbinformationen übergeben.

FlyweightPatternDemo.java

public class FlyweightPatternDemo {
   private static final String Farben [] = 
      { "Rot", "Grün", "Blau", "Weiß", "Schwarz"};
   public static void main (String [] args) {

      for (int i = 0; i <20; i ++) {
         Kreis Kreis = 
            (Kreis) ShapeFactory.getCircle (getRandomColor ());
         circle.setX (getRandomX ());
         circle.setY (getRandomY ());
         circle.setRadius (100);
         circle.draw ();
      }
   }
   private static String getRandomColor () {
      Rückkehr Farben [(int) (Math.random () * colors.length)];
   }
   private static int getRandomX () {
      return (int) (Math.random () * 100);
   }
   private static int getRandomY () {
      return (int) (Math.random () * 100);
   }
}

Schritt 5

Stellen Sie sicher, ausgegeben.

Erstellen Kreis der Farbe: Schwarz
Circle: Draw () [Farbe: Schwarz, x: 36, y: 71, Radius: 100
Erstellen Kreis der Farbe: Grün
Circle: Draw () [Farbe: Grün, x: 27, y: 27, Radius: 100
Erstellen Kreis der Farbe: Weiß
Circle: Draw () [Farbe: Weiß, x: 64, y: 10, Radius: 100
Erstellen Kreis der Farbe: Rot
Circle: Draw () [Farbe: Rot, x: 15, y: 44, Radius: 100
Circle: Draw () [Farbe: Grün, x: 19, y: 10, Radius: 100
Circle: Draw () [Farbe: Grün, x: 94, y: 32, Radius: 100
Circle: Draw () [Farbe: Weiß, x: 69, y: 98, Radius: 100
Erstellen Kreis der Farbe: Blau
Circle: Draw () [Farbe: Blau, x: 13, y: 4, Radius: 100
Circle: Draw () [Farbe: Grün, x: 21, y: 21, Radius: 100
Circle: Draw () [Farbe: Blau, x: 55, y: 86, Radius: 100
Circle: Draw () [Farbe: Weiß, x: 90, y: 70, Radius: 100
Circle: Draw () [Farbe: Grün, x: 78, y: 3, Radius: 100
Circle: Draw () [Farbe: Grün, x: 64, y: 89, Radius: 100
Circle: Draw () [Farbe: Blau, x: 3, y: 91, Radius: 100
Circle: Draw () [Farbe: Blau, x: 62, y: 82, Radius: 100
Circle: Draw () [Farbe: Grün, x: 97, y: 61, Radius: 100
Circle: Draw () [Farbe: Grün, x: 86, y: 12, Radius: 100
Circle: Draw () [Farbe: Grün, x: 38, y: 93, Radius: 100
Circle: Draw () [Farbe: Rot, x: 76, y: 82, Radius: 100
Circle: Draw () [Farbe: Blau, x: 95, y: 82, Radius: 100