Fliegengewichtdefinition: Vermeiden Sie den Overhead einer großen Anzahl von Unterklassen mit demselben Inhalt (z. B. Speicherverbrauch), damit jeder eine Klasse (Metaclass) teilen kann.
Warum sollten Sie den Shared -Modus/den Xiyuan -Modus verwenden?
Das Prinzip der objektorientierten Sprache ist, dass alles ein Objekt ist, aber wenn es wirklich verwendet wird, erscheint die Anzahl der Objekte manchmal riesig. Die Anzahl der Objekte ist was Einige Merkmale hängen von der Anwendung (Kontext) ab, die nicht geteilt wird, was auch die Unterscheidung zwischen zwei wichtigen Konzepten im Fliegengewicht ist: interner Zustand intrinsisch und externer Zustand extrinsisch.
Um es unverblümt auszudrücken, erzeugt es zuerst ein Originalmodell und erzeugt dann bestimmte Modelle mit unterschiedlichen Eigenschaften nach verschiedenen Anlässen und Umgebungen. Der interne Zustand des Fliegengewichts wird verwendet, um das Fliegengewicht für die Aufrechterhaltung eines Flygewichts -Pools (Moduspool) zum Speichern von Objekten mit internem Zustand zu verantwortlich.
Der Flygewicht -Modus ist ein Modus, der die Programmeffizienz und -leistung verbessert, was die Laufgeschwindigkeit des Programms erheblich beschleunigt. Es gibt viele Anwendungsszenarien: Wenn Sie beispielsweise eine Reihe von Zeichenfolgen aus einer Datenbank lesen möchten, von denen viele wiederholt werden, können wir diese Zeichenfolgen in einem Flyweight Pool (Pool) speichern.
So verwenden Sie den gemeinsam genutzten Modus-/Freigabemodus
Beginnen wir mit der abstrakten Schnittstelle zwischen Flygewicht:
Die Codekopie lautet wie folgt:
öffentliche Schnittstelle Flygewicht {
öffentliche Leereoperation (Extrinsicstate State);
}
// Für dieses Muster verwendete abstrakte Datentypen (selbstgemacht)
public interface extrinsicstate {}
Das Folgende ist die spezifische Implementierung der Schnittstelle (Concreteflygewicht) und fügt dem internen Zustand Speicherplatz hinzu. Nichts zu tun.
Die Codekopie lautet wie folgt:
öffentliche Klasse Concretflygewicht implementiert Flygewicht {
privater Intrinsicstate -Staat;
public void operation (extrinsicstate state) {
// spezifischer Betrieb
}
}
Natürlich müssen nicht alle Unterklassen der Implementierung von Fliegengewicht geteilt werden, sodass es eine andere Art von Betrügerflygewicht gibt, das nicht geteilt wird:
Die Codekopie lautet wie folgt:
öffentliche Klasse UnsaredConcretflygewicht implementiert Flyweight {
public void operation (extrinsicstate state) {}
}
Das Flyweight -Werk ist für die Aufrechterhaltung eines Flygewichts -Pools (speichert interne Zustand). Erstellen Sie ansonsten ein neues Objekt zum Pool und kehren Sie zurück, um den Objektpool zu senden.
Die Codekopie lautet wie folgt:
öffentliche Klasse Flygewichtfaktor {
// Fliegengewichtspool
private Hashtable -Flygewichte = neuer Hashtable ();
öffentliches Fliegengewicht Getflygewicht (Objektschlüssel) {
Flygewicht Flyweight = (Flygewicht) flygewichtet.get (Schlüssel);
if (flygewicht == null) {
// neue Betrügerflygewicht generieren
flygewicht = new Concretflygewicht ();
flyweights.put (Key, Flygewicht);
}
Rückfliegengewicht;
}
}
Zu diesem Zeitpunkt ist der grundlegende Framework des Fliegengewichts -Modus fertig. Sehen wir uns an, wie Sie anrufen:
Die Codekopie lautet wie folgt:
FlyweightFactory factory = new Flygewichtfaktory ();
Flygewicht fly1 = factory.getflygewicht ("fred");
Flygewicht fly2 = factory.getflygewicht ("wilma");
......
Aus der Perspektive der Berufung scheint es eine rein fabrische Verwendung zu sein, aber das Geheimnis liegt in der internen Gestaltung der Fabrik.
Das Fliegengewichtschema wird in XML und anderen Datenquellen angewendet
Wir haben oben erwähnt, dass wenn eine große Anzahl von Strings aus einer Datenquelle gelesen wird, es Duplikate in der IT geben muss, dann können wir den Fliegengewichtsmodus verwenden, um die Effizienz zu verbessern. CDs werden Material gespeichert.
Jede CD hat drei Felder:
1. Veröffentlichungsdatum (Jahr)
2. Informationen wie Sängername (Künstler)
3. Rekordtits (Titel)
Unter ihnen kann der Name des Sängers wiederholt werden, dh es gibt möglicherweise CDs mit verschiedenen Liedern verschiedener Perioden desselben Sängers. Wir nehmen den "Sängernamen" als gemeinsam genutzbarer Betrugsflygewicht.
Schauen wir uns zunächst den Inhalt der XML -Datei der Datenquelle an:
Die Codekopie lautet wie folgt:
<? xml Version = "1.0"?>
<Kollektion>
<DD>
<titels> Eine andere grüne Welt </title>
<Jahr> 1978 </Jahr>
<Artist> Eno, Brian </künstler>
</cd>
<DD>
<titels> Greatest Hits </title>
<Jahr> 1950 </Jahr>
<Artist> Holiday, Billie </künstler>
</cd>
<DD>
<titels> Tiger Mountain (nach Strategie) </title>
<Jahr> 1977 </Jahr>
<Artist> Eno, Brian </künstler>
</cd>
.........
</collection>
Obwohl das obige Beispiel nur 3 CDs hat, können CDs als Unterkategorie großer Wiederholungen angesehen werden, da nur drei Felder in den Komponenten und Duplikate (Sängername) vorhanden sind.
Die CD ähnelt dem obigen Schnittstellenfliegengewicht:
Die Codekopie lautet wie folgt:
öffentliche Klasse CD {
privater String -Titel;
privates Int -Jahr;
Privatkünstler;
public String gettitle () {return title;}
public int getyear () {Rückgabejahr;}
öffentlicher Künstler Getartist () {Rückkehrer;}
public void setitle (String t) {title = t;}
public void setyear (int y) {Jahr = y;}
public void setArtist (Künstler a) {künstler = a;}
}
Verwenden Sie "Singer Name" als gemeinsam genutzbarer Betrugsflygewicht:
Die Codekopie lautet wie folgt:
Künstler der öffentlichen Klasse {
// interner Status
privater Zeichenfolge Name;
// Beachten Sie, dass der Künstler unveränderlich ist.
String getName () {return name;}
Künstler (String n) {
Name = n;
}
}
Schauen wir uns einen Blick auf das Flyweight Factory an, das speziell zum Erstellen des gemeinsam genutzbaren Betrugsgewichts verwendet wird: Künstler
Die Codekopie lautet wie folgt:
public class ArtistFactory {
Hashtable Pool = new Hashtable ();
Künstler GetArtist (String Key) {
Künstlerergebnis;
result = (künstler) pool.get (key);
//// neue Künstler generieren
if (result == null) {
Ergebnis = neuer Künstler (Schlüssel);
Pool.put (Schlüssel, Ergebnis);
}
Rückgabeergebnis;
}
}
Wenn Sie Tausende oder mehr CDs haben, spart der Fliegengewichtsmodus mehr Platz, und je mehr Fluggewicht Sie teilen, desto größer wird die Speichereinsparungen.