Fliegengewicht-Muster

Fliegengewicht ist ein Softwaredesignmuster. Ein Fliegengewicht ist ein Gegenstand, der Speichergebrauch durch das Teilen so vieler Daten wie möglich mit anderen ähnlichen Gegenständen minimiert; es ist eine Weise, Gegenstände in der großen Anzahl zu verwenden, wenn eine einfache wiederholte Darstellung einen unannehmbaren Betrag des Gedächtnisses verwenden würde. Häufig können einige Teile des Gegenstand-Staates geteilt werden, und es ist übliche Praxis, um sie in Außendatenstrukturen zu halten und ihnen zu den Fliegengewicht-Gegenständen provisorisch zu passieren, wenn sie verwendet werden.

Ein klassischer Beispiel-Gebrauch des Fliegengewicht-Musters ist die Datenstrukturen für die grafische Darstellung von Charakteren in einem Textverarbeitungsprogramm. Es könnte wünschenswert sein, für jeden Charakter in einem Dokument, ein Glyph-Gegenstand zu haben, der seinen Schriftart-Umriss, Schriftart-Metrik und andere Formatierungsdaten enthält, aber das würde sich auf Hunderte oder Tausende von Bytes für jeden Charakter belaufen. Statt dessen für jeden Charakter könnte es eine Verweisung auf ein Fliegengewicht glyph Gegenstand geben, der durch jedes Beispiel desselben Charakters im Dokument geteilt ist; nur die Position jedes Charakters (im Dokument und/oder der Seite) würde innerlich versorgt werden müssen.

In anderen Zusammenhängen wird die Idee, identische Datenstrukturen zu teilen, Kuddelmuddel consing genannt.

Geschichte

Gemäß einem Lehrbuch-Design Muster: Elemente der Objektorientierten Mehrwegsoftware, das Fliegengewicht-Muster wurde zuerst ins Leben gerufen und umfassend von Paul Calder und Mark Linton 1990 erforscht, um glyph Information in einem WYSIWYG Dokumentenredakteur effizient zu behandeln, obwohl ähnliche Techniken bereits in anderen Systemen, z.B, einem Anwendungsfachwerk von Weinand verwendet wurden u. a. (1988).

Beispiel (Java)

//Fliegengewicht-Gegenstand

öffentliche Schnittstelle CoffeeOrder {\

öffentliche Leere serveCoffee (Zusammenhang von CoffeeOrderContext);

}\

</Quelle>

//Gegenstand von ConcreteFlyweight, der ConcreteFlyweight schafft

öffentliche Klasse CoffeeFlavor führt CoffeeOrder {\durch

privater Schnur-Geschmack;

öffentlicher CoffeeFlavor (Spannen newFlavor), {\

Geschmack = newFlavor;

}\

öffentliche Schnur getFlavor {\

geben Sie this.flavor zurück;

}\

öffentliche Leere serveCoffee (Zusammenhang von CoffeeOrderContext) {\

System.out.println ("Kaffee-Geschmack" + Geschmack + "zur Tabellenzahl" + context.getTable ) dienend;

}\}\</Quelle>

öffentliche Klasse CoffeeOrderContext {\

private interne Nummer tableNumber;

öffentlicher CoffeeOrderContext (interne Nummer tableNumber) {\

this.tableNumber = tableNumber;

}\

öffentliche interne Nummer getTable {\

geben Sie this.tableNumber zurück;

}\}\</Quelle>

Import java.util. HashMap;

Import java.util. Karte;

//FlyweightFactory wenden ein

öffentliche Klasse CoffeeFlavorFactory {\

private Karte

öffentlicher CoffeeFlavor getCoffeeFlavor (Spannen flavorName), {\

Geschmack von CoffeeFlavor = flavors.get (flavorName);

wenn (Geschmack == ungültig) {\

Geschmack = neuer CoffeeFlavor (flavorName);

flavors.put (flavorName, Geschmack);

}\

geben Sie Geschmack zurück;

}\

öffentliche interne Nummer getTotalCoffeeFlavorsMade {\

geben Sie flavors.size zurück;

}\}\</Quelle>

öffentliche Klasse TestFlyweight {\

/ ** Die Geschmäcke bestellt. * /

privater statischer CoffeeFlavor [] Geschmäcke = neuer CoffeeFlavor [100];

/ ** Die Tische für die Ordnungen. * /

privater statischer CoffeeOrderContext [] Tische = neuer CoffeeOrderContext [100];

private statische interne Nummer ordersMade = 0;

privater statischer CoffeeFlavorFactory flavorFactory;

öffentliche statische Leere takeOrders (Spannen flavorIn, int Tisch), {\

Geschmäcke [ordersMade] = flavorFactory.getCoffeeFlavor (flavorIn);

Tische [ordersMade ++] = neuer CoffeeOrderContext (Tisch);

}\

öffentliche statische leere Hauptsache (Schnur [] args) {\

flavorFactory = neuer CoffeeFlavorFactory ;

takeOrders ("Cappuccino", 2);

takeOrders ("Cappuccino", 2);

takeOrders ("Frappe", 1);

takeOrders ("Frappe", 1);

takeOrders ("Xpresso", 1);

takeOrders ("Frappe", 897);

takeOrders ("Cappuccino", 97);

takeOrders ("Cappuccino", 97);

takeOrders ("Frappe", 3);

takeOrders ("Xpresso", 3);

takeOrders ("Cappuccino", 3);

takeOrders ("Xpresso", 96);

takeOrders ("Frappe", 552);

takeOrders ("Cappuccino", 121);

takeOrders ("Xpresso", 121);

für (interne Nummer i = 0; ich

Siehe auch

Mehrtonne

Links


Lassen Sie es sein / Vereinigungen von Zeugen Jehovas
Impressum & Datenschutz