Fliegengewichtsmodus „Design Pattern“.

1. Was ist das Fliegengewichtsmodell?

Der Flyweight-Modus unterstützt effektiv die feinkörnige Wiederverwendung von Objekten mit kleinen Zustandsänderungen durch die Sharing-Technologie. Wenn im System mehrere identische Objekte vorhanden sind, wird nur eine Kopie gemeinsam genutzt, und es ist nicht erforderlich, für jedes Objekt ein Objekt zu instanziieren, was die Kosten erheblich reduziert Anzahl der Objekte im System. Beispielsweise definiert in einem Textsystem jeder Buchstabe ein Objekt. Dann gibt es insgesamt 52 Groß- und Kleinbuchstaben, sodass 52 Objekte definiert werden müssen. Wenn es einen 1M-Text gibt, gibt es so viele Buchstaben. Wenn jeder Buchstabe ein Objekt definiert, ist der Speicher erschöpft. Wenn also jeder Buchstabe ein gemeinsames Objekt hat, werden die Ressourcen erheblich gespart.

Bevor wir den Fliegengewichtsmodus verstehen, müssen wir zunächst zwei Konzepte verstehen: den internen Zustand und den externen Zustand.

  • Interner Zustand: Der gemeinsame Teil innerhalb des Flyweight-Objekts, der sich bei Änderungen in der externen Umgebung nicht ändert.
  • Externer Status: ändert sich, wenn sich die Umgebung ändert, und der Status, der nicht geteilt werden kann, ist der externe Status.

Da das Fliegengewichtsmuster zwischen internem und externem Zustand unterscheidet, können wir verschiedene externe Zustände festlegen, sodass dasselbe Objekt unterschiedliche Eigenschaften haben kann, während der interne Status auf denselben Teil festgelegt ist. In unserem Programmierprozess benötigen wir möglicherweise eine große Anzahl feinkörniger Objekte zur Darstellung von Objekten. Wenn diese Objekte bis auf einige unterschiedliche Parameter gleich sind, können wir das Fliegengewichtsmuster verwenden, um die Anzahl der Schritte in der Anwendung erheblich zu reduzieren . Objekt. Wie verwende ich den Fliegengewichtsmodus? Hier müssen wir nur eine kleine Anzahl ihrer unterschiedlichen Teile als Parameter an die Außenseite der Klasseninstanz verschieben und sie dann beim Aufruf der Methode übergeben. Dies verdeutlicht auch einen Punkt: Der interne Status wird im Flyweight-Objekt gespeichert, während der externe Status vom Client berücksichtigt werden sollte.

2. UML-Strukturdiagramm

  • (1) Fliegengewicht: abstrakte Fliegengewichtsklasse, die Oberklasse oder Schnittstelle aller konkreten Fliegengewichtsklassen. Über diese Schnittstelle kann Fliegengewicht externe Themen akzeptieren und darauf reagieren;
  • (2) ConcreteFlyweight: Betonfliegengewichtsklasse. Geben Sie den internen Status an und fügen Sie Speicherplatz für den internen Status hinzu.
  • (3) UnsharedConcreteFlyweight: Nicht gemeinsam genutzte Betonfliegengewichtsklasse. Gibt die Flyweight-Unterklassen an, die nicht gemeinsam genutzt werden müssen.
  • (4) FlyweightFactory: Flyweight-Factory-Klasse, die zum Erstellen und Verwalten von Flyweight-Objekten verwendet wird. Sie wird hauptsächlich verwendet, um eine angemessene gemeinsame Nutzung von Flyweight sicherzustellen.

Der Kern des Flyweight-Modells ist die Flyweight-Factory-Klasse. Die Flyweight-Factory-Klasse verwaltet einen Objektspeicherpool. Wenn der Client ein Objekt benötigt, ruft er es zunächst aus dem Flyweight-Pool ab. Wenn sich im Flyweight-Pool eine Objektinstanz befindet, wird sie verwendet wird direkt zurückgegeben. Wenn es nicht im Flyweight-Pool vorhanden ist, wird eine neue Flyweight-Objektinstanz erstellt und an den Benutzer zurückgegeben, und das neue Objekt wird im Flyweight-Pool gespeichert. Dies hat die Bedeutung eines Singletons.

Factory-Klassen verwenden normalerweise Sammlungstypen zum Speichern von Objekten wie HashMap, Hashtable, Vector usw. In Java sind Datenbankverbindungspools, Thread-Pools usw. alle Anwendungen, die den Flyweight-Modus verwenden.

public class FlyweightFactory{
    private HashMap flyweights = new HashMap();
    
    public Flyweight getFlyweight(String key){
        if(flyweights.containsKey(key)){
            return (Flyweight)flyweights.get(key);
        }
        else{
            Flyweight fw = new ConcreteFlyweight();
            flyweights.put(key,fw);
            return fw;
        }
    }
}

3. Code-Implementierung

Szenario: Wenn wir über eine Zeichenanwendung verfügen, mit der wir Grafiken in verschiedenen Formen und Farben zeichnen können, sind Form und Farbe hier interne Zustände. Durch den Fliegengewichtsmodus können wir die gemeinsame Nutzung dieser Attribute realisieren. wie folgt:

Erstens ist die Formklasse: Shape.java. Es handelt sich um eine abstrakte Klasse mit nur einer abstrakten Methode zum Zeichnen von Grafiken.

public abstract class Shape {
    public abstract void draw();
}

Dann gibt es noch die konkrete Klasse zum Zeichnen von Kreisen. Circle.java:

public class Circle extends Shape{
    private String color;
    public Circle(String color){
        this.color = color;
    }
 
    public void draw() {
        System.out.println("画了一个" + color +"的圆形");
    }
}

Dann gibt es noch die Fabrikklasse im Fliegengewicht. FliegengewichtFabrik:

//核心类
public class FlyweightFactory{
    static Map<String, Shape> shapes = new HashMap<String, Shape>();
    
    public static Shape getShape(String key){
        Shape shape = shapes.get(key);
        //如果shape==null,表示不存在,则新建,并且保持到共享池中
        if(shape == null){
            shape = new Circle(key);
            shapes.put(key, shape);
        }
        return shape;
    }
    
    public static int getSum(){
        return shapes.size();
    }
}

Hier wird eine HashMap definiert, um jedes Objekt zu speichern. Wenn der Benutzer ein Objekt benötigt, erhält er es zunächst aus dem Flyweight-Pool. Wenn es nicht im Flyweight-Pool vorhanden ist, wird ein neues Flyweight-Objekt erstellt und an den Benutzer zurückgegeben im Flyweight-Pool gespeichert. Speichern Sie das neue Objekt in .

Schließlich das Client-Programm: Client.java:

public class Client {
    public static void main(String[] args) {
        Shape shape1 = FlyweightFactory.getShape("红色");
        shape1.draw();
        
        Shape shape2 = FlyweightFactory.getShape("灰色");
        shape2.draw();
        
        Shape shape3 = FlyweightFactory.getShape("绿色");
        shape3.draw();
        
        Shape shape4 = FlyweightFactory.getShape("红色");
        shape4.draw();
        
        Shape shape5 = FlyweightFactory.getShape("灰色");
        shape5.draw();
        
        Shape shape6 = FlyweightFactory.getShape("灰色");
        shape6.draw();
        
        System.out.println("一共绘制了"+FlyweightFactory.getSum()+"中颜色的圆形");
    }
}

Operationsergebnis:

In Java verwendet der String-Typ das Flyweight-Muster . Das String-Objekt ist ein endgültiger Typ und kann nach der Erstellung des Objekts nicht mehr geändert werden. Die Zeichenfolgenkonstanten von Java werden im Zeichenfolgenkonstantenpool gespeichert, und die JVM stellt sicher, dass sich nur eine Kopie einer Zeichenfolgenkonstante im Konstantenpool befindet. 

String a="abc", wobei „abc“ eine Stringkonstante ist. Wer mit Java vertraut ist, sollte das folgende Beispiel kennen:

String a = "hello";
String b = "hello";
if(a == b)
 System.out.println("OK");
else
 System.out.println("Error");

Die Ausgabe ist: OK. Es ist ersichtlich, dass die if-Bedingung die Adressen der beiden Adressen a und b vergleicht, was auch als Speicherplatz bezeichnet werden kann.

4. Vor- und Nachteile des Fliegengewichtsmodells

4.1. Vorteile des Fliegengewichtsmodus:

(1) Reduzieren Sie die Anzahl der Objekte im System erheblich.

(2) Da der externe Status verwendet wird, ist der externe Status relativ unabhängig und hat keinen Einfluss auf den internen Status. Daher ermöglicht der Flyweight-Modus die gemeinsame Nutzung von Flyweight-Objekten in verschiedenen Umgebungen.

4.2. Nachteile des Fliegengewichtsmodus:

(1) Da das Fliegengewichtsmuster zwischen externen Zuständen und internen Zuständen unterscheiden muss, wird die Anwendung bis zu einem gewissen Grad komplizierter.

(2) Um das Objekt gemeinsam nutzbar zu machen, muss der Status des Flyweight-Objekts externalisiert werden, und das Lesen des externen Status verlängert die Laufzeit.

4.3. Anwendbare Szenarien:

(1) Wenn sich im System eine große Anzahl identischer oder ähnlicher Objekte befindet, führt die große Verwendung solcher Objekte zu einem Systemspeicherverbrauch. Sie können den Flyweight-Modus verwenden, um die Anzahl der Objekte im System zu reduzieren.

(2) Der größte Teil des Zustands des Objekts kann externalisiert werden, und diese externen Zustände können an das Objekt übergeben werden.

Referenzartikel:  Strukturtyp des Java-Entwurfsmusters: Fliegengewichtsmuster_Zhang Weipengs Blog-CSDN-Blog

Ich denke du magst

Origin blog.csdn.net/m0_50370837/article/details/126305428
Empfohlen
Rangfolge