Eines der Strukturmuster zielt darauf ab, die Speichernutzung zu reduzieren, indem so viele Daten wie möglich mit ähnlichen Objekten geteilt werden.
Dies ist besonders nützlich, wenn es um eine große Anzahl ähnlicher Objekte geht, bei denen das Erstellen einer neuen Instanz für jedes Objekt im Hinblick auf den Speicherverbrauch teuer wäre.
Schlüsselkonzepte:
Intrinsischer Zustand: Der Zustand, der von mehreren Objekten gemeinsam genutzt wird, ist unabhängig vom Kontext und bleibt über verschiedene Objekte hinweg gleich.
Extrinsischer Zustand: Der Zustand, der für jedes Objekt eindeutig ist und vom Client übergeben wird. Dieser Zustand kann variieren und wird nicht im Flyweight-Objekt gespeichert
Wichtige Teilnehmer:
Flyweight: Schnittstelle, über die das Flyweight-Objekt den Extrinsic-Status empfängt und verwendet.
ConcreteFlyweight: Implementiert das Flyweight und speichert den intrinsischen Zustand.
FlyweightFactory: Verwaltet die Flyweight-Objekte und stellt die gemeinsame Nutzung von Schnittstellen sicher. Sie gibt ein vorhandenes Flyweight zurück, wenn es bereits existiert.
Client (wie Hauptklasse): Behält einen Verweis auf Flyweight bei und stellt einen extrinsischen Zustand bereit, wenn er mit dem Flyweight-Objekt interagieren muss.
Nehmen wir ein Beispiel für ein Flyweight-Objekt mit Charakter
Angenommen, wir haben einen Texteditor, der eine große Textmenge rendern muss. Jeder Charakter kann als Objekt dargestellt werden, aber ein separates Objekt für jeden Charakter würde viel Speicher verschwenden. Stattdessen können wir Flyweights verwenden, um die Zeichenobjekte, die jeden Buchstaben darstellen, gemeinsam zu nutzen und den extrinsischen Zustand wie die Position oder Formatierung außerhalb von
Fliegengewicht
public interface Flyweight { public void display(int x, int y);//x, y are the extrinsic state of the Flyweight object }
BetonFliegengewicht
public class CharacterFlyweight implements Flyweight { private char ch; public CharacterFlyweight(char c){ this.ch = c; } @Override public void display(int x ,int y){ System.out.println("[drawing character: " this.ch " at co-ordinates:(" x "," y ")]"); } }
FlyweightFactory
public class FlyweightFactory { private static HashMapflyweights = new HashMap(); public static Flyweight getFlyweight(char c){ Flyweight flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new CharacterFlyweight(c); flyweights.put(c,flyweight); } return flyweight; } }
Hauptsächlich
public class Main { public static void main(String args[]){ Flyweight flyweight1 = FlyweightFactory.getFlyweight('a'); Flyweight flyweight2 = FlyweightFactory.getFlyweight('b'); Flyweight flyweight3 = FlyweightFactory.getFlyweight('a');// will use the same object that is referenced by flyweight1 flyweight1.display(1, 2);//'a' displayed at 1,2 flyweight2.display(3, 4);//'b' displayed at 3,4 flyweight3.display(5, 7); // 'a'(shared) displayed at 5,7 } }
Ausgabe:
[drawing character: a at co-ordinates:(1,2)] [drawing character: b at co-ordinates:(3,4)] [drawing character: a at co-ordinates:(5,7)]
Wichtige Punkte
Nachteile
Komplexität: Das Muster kann die Komplexität des Codes erhöhen, insbesondere bei der getrennten Verwaltung der extrinsischen und intrinsischen Zustände.
Overhead: Wenn nur wenige Objekte gemeinsam genutzt werden können, führt das Flyweight-Muster möglicherweise zu unnötiger Komplexität ohne nennenswerte Speichereinsparungen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3