Ich habe Entwurfsmuster studiert und bin über das Fliegengewichtmuster gekommen. Ich habe versucht, Möglichkeiten zur Verwendung des Musters in meinen Anwendungen zu finden, aber ich habe Probleme, die Verwendung des Musters zu erkennen. Was sind auch einige Anzeichen dafür, dass ein Fliegengewichtmuster verwendet wird, wenn ich den Code anderer Leute lese?
Nach der Definition heißt es:
Verwenden Sie die Freigabe, um eine große Anzahl feinkörniger Objekte effizient zu unterstützen.
Wenn ich es richtig lese, können Wörterbücher und Hashtables Beispiele für Fliegengewichte sein. Ist das richtig?
Danke im Voraus.
design-patterns
Jeremy E
quelle
quelle
Antworten:
Ein Beispiel sind die Java-Bibliotheken. Java hat primitive Typen (z. B.
int
eine 32-Bit-Ganzzahl) und Wrapper für diese (z. B.Integer
welche Wrapsint
). Es gibt Methoden , um „Box“ einint
in eineInteger
und unbox einerInteger
in einint
. Die Wrapper sind notwendig, da die primitiven Typen keine Objekte sind und daher zB nicht als Schlüssel inMap
s verwendet oder inCollection
s platziert werden können.Die Boxing-Methode verwendet ein Array von Flyweight-Objekten als eine Art Cache für
Integer
s, dieint
Werten zwischen -128 und 127 entsprechen. Da dies die Werte sind, die am wahrscheinlichsten als Schlüssel verwendet oder in Sammlungen platziert werden, werden Zuweisung und Speicherbedarf reduziert. (Wenn 5000000Integer
s den Wert 0 darstellen, wird 5000000-mal so viel Speicher belegt wie bei der Wiederverwendung der Flyweight-Instanz).quelle
Grafik. In der Regel ist ein Rasterbild (das das Rückgrat der meisten Computergrafiken auf Verbraucherebene ist) CPU-günstig, aber speicherintensiv (was in Ordnung ist, weil der Speicher billig, aber die CPU teuer ist). Wenn dieses Rasterbild beim Rendern einer größeren Benutzeroberfläche mehrmals wiederholt werden soll (von Symbolen in einer Windows-GUI-App über Zeichen einer Schriftart in einem Textverarbeitungsprogramm bis hin zu Texturen auf Oberflächen in einem 3D-Spiel), ist dies sehr sinnvoll Laden Sie das Bild einmal in den Speicher und zeigen Sie einfach mit sehr einfachen Objekten darauf, die billig herzustellen sind und selbst nicht viel Speicher beanspruchen. Ein Sprite, bei dem es sich lediglich um einen Punkt im Grafikbereich handelt, an dem ein Bild angezeigt werden soll, ist lediglich ein 3D-Punkt und ein Speicherzeiger auf das erste Pixel des zu verwendenden Bilds. MÖGLICHERWEISE enthält es auch die Abmessungen des zu verwendenden Teils der Sprite-Image-Datei. entweder grafisch oder speicherbezogen. Diese Informationen sind alle sehr kostengünstig zu ändern, beispielsweise um das Bild oder die Position des Sprites zu ändern, und sie können durchgeführt werden, ohne jedes Mal ein neues Bild zu laden, wodurch die Leistung des zugrunde liegenden Programms zum Manipulieren und Anzeigen der richtigen Teile des Sprites drastisch erhöht wird richtige Bilder, um eine komplette UI "Szene" zu rendern.
quelle
ASCII-Range-
Character
Instanzen in Smalltalk sind Fliehgewichte.Wenn Sie etwas wie auswerten
Character space
,Character class >> #value:
führt Folgendes aus:Die Klassenvariable
CharacterTable
wird folgendermaßen initialisiert:Wenn Sie also einen String erstellen, werden die ASCII-Bereiche
Character
nichtCharacterTable
jedes Mal neu erstellt, sondern von dort.quelle
Mit dem Fliegengewichtmuster sollen unnötige Objektinitialisierungen vermieden und somit Platz gespart werden. Nach der Definition von GOF kann ein Objekt zwei Zustände haben, den intrinsischen und den extrinsischen:
Angenommen, wir möchten eine einfache Texteditor-Anwendung entwickeln, in der jede Spalte alle Zeilen des Texts enthält und die Zeile Zeichen enthalten kann.
Das Dilemma hier ist, wie die Character-Klasse entworfen wird. Die
char c
innerhalb der Character-Klasse sollte das Hauptobjekt (innerer Zustand) sein. Ein Zeichen kann jedoch eine Schriftart und eine Schriftgröße (extrinsischer Zustand) haben. Daher müssen wir seinen extrinsischen Status in der Zeile (Client) speichern und bei Bedarf darauf zugreifen. Zu diesem Zweck werden zwei Listen erstellt, in denen die Schriftarten und die Größen gespeichert sind.Durch Befolgen des Flyweight-Musters kann das Zeichen nun wiederverwendet werden und die Objekte werden aus einer bestimmten Liste von Objekten (dem Flyweight-Pool) referenziert, die alle ASCII-Symbole (
Character
Objekte) enthält.Folgendes habe ich visuell beschrieben:
Zum Drucken von "Hallo" sind nur 4
Character
statt 5 Objekte erforderlich. Sobald die Schriftart geändert wurde, sind keine neuen Objekte erforderlich. Beachten Sie, dass dies nicht möglich wäre, wenn wir den extrinsischen Status in der Character-Klasse gespeichert hätten, z.Das Anwenden dieses Musters auf große Datasets würde zu erheblichen Optimierungen der Speicherkomplexität der Anwendung und der Wiederverwendbarkeit von Objekten führen.
quelle