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:
- Eigenzustand: Wird im Fliegengewicht gespeichert; Es besteht aus Informationen, die unabhängig vom Kontext der Fliehgewichte sind und somit gemeinsam genutzt werden können.
- Extrinsischer Zustand: hängt vom Kontext des Fliegengewichts ab und variiert mit diesem und kann daher nicht geteilt werden. Client-Objekte sind dafür verantwortlich, den extrinsischen Status an das Flyweight zu übergeben, wenn es benötigt wird.
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.
class Character
{
char c;
int Size;
Font font;
....
}
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.