In Dr. Yan Hongs Buch "Java and Mode" beginnt es mit der Beschreibung des Flygewichts -Modus:
Das Fliegengewicht bezieht sich auf das leichteste Gewichtsniveau, das heißt "Fliegengewicht" oder "Regen Level". Die Übersetzung des "Xienyuan -Modus" wird hier ausgewählt, da dies die Absicht des Modus besser widerspiegeln kann. Das Enzyklopädiemuster ist das strukturelle Muster eines Objekts. Der Encyclopedia-Modus unterstützt eine große Anzahl feinkörniger Objekte auf gemeinsame Weise.
String -Typ in Java
In der Java -Sprache verwendet der String -Typ den Encyclopedia -Modus. Das String -Objekt ist abschließend und kann nach dem Erstellen nicht geändert werden. In Java sind Streichkonstanten im konstanten Pool vorhanden. Java sorgt dafür, dass eine String -Konstante nur eine Kopie im konstanten Pool hat. Zeichenfolge a = "ABC", wobei "ABC" eine String -Konstante ist.
public class test {public static void main (String [] args) {string a = "abc"; Zeichenfolge b = "ABC"; System.out.println (a == b); }}Das Ergebnis des obigen Beispiels ist wahr, was bedeutet, dass sich sowohl A als auch B auf dieselbe Stringkonstante "ABC" im konstanten Pool beziehen. Ein solches Design vermeidet unnötige große Mengen an Ressourcenverbrauch, die beim Erstellen von N oder identischen Objekten erzeugt werden.
Die Struktur des Genussmodells
Das Genussmodell nimmt eine Freigabe an, um zu vermeiden, dass das gleiche Inhaltsobjekt auf demselben Inhaltsobjekt verfügt. Das häufigste und intuitivste an diesem Overhead ist der Gedächtnisverlust. Der Schlüssel zum Teilen des Encyclopedia -Objekts besteht darin, zwischen dem internen und dem externen Zustand zu unterscheiden.
Ein intrinsischer Zustand wird im Xiangyuan -Objekt gespeichert und variiert nicht mit der Umwelt. Daher kann ein Opferelement einen intrinsischen Zustand haben und geteilt werden.
Ein externer Zustand ändert sich mit der Umweltveränderung und kann nicht geteilt werden. Der äußere Zustand des Xiangyuan -Objekts muss vom Klienten gespeichert werden, und nachdem das Xiangyuan -Objekt erstellt wurde, wird es in das Xiangyuan -Objekt übergeben, wenn es verwendet werden muss. Externe Zustände können den inneren Zustand des lebenden Objekts nicht beeinflussen, sie sind unabhängig voneinander.
Der Genuss -Yuan -Modus kann in zwei Formulare unterteilt werden: den Yuan -Modus und der Composite -Genuss -Yuan -Modus.
Einfacher Genussmodus
Im einfachen vorhandenen Modus können alle vorhandenen Objekte geteilt werden.
Die Rollen, die im einfachen Genussmodus verbunden sind, sind wie folgt:
Abstract Flygewichtsrolle: Gibt eine abstrakte Schnittstelle an, um die Methoden anzugeben, die alle spezifischen Fliegengewichtsrollen implementiert werden müssen.
Rolle des Betrugsflygewichts: Implementiert die durch die abstrakte Xiangyuan -Rolle festgelegte Grenzfläche. Wenn es einen intrinsischen Zustand gibt, müssen Sie für den Speicherplatz für den intrinsischen Zustand verantwortlich sein.
FlyweightFactory -Rolle: Diese Rolle ist für die Erstellung und Verwaltung der Xiangyuan -Rolle verantwortlich. Diese Rolle muss sicherstellen, dass das Genussobjekt vom System ordnungsgemäß geteilt werden kann. Wenn ein Kundenobjekt ein Xiangyuan -Objekt aufruft, prüft die Xiangyuan -Rolle, ob bereits ein Xiangyuan -Objekt vorhanden ist, das den Anforderungen im System entspricht. Wenn es bereits existiert, sollte die Xiangyuan -Fabrikrolle das bestehende Xiangyuan -Objekt liefern. Wenn es kein geeignetes Xiangyuan -Objekt im System gibt, sollte die Xiangyuan -Fabrikrolle ein geeignetes Xiangyuan -Objekt schaffen.
Quellcode
Abstrakte Charakterklasse
Der Parameterzustand ist der externe Zustand der öffentlichen Void -Operation (String -Status);}
Das spezifische Enzyklopädie -Charakterklassen -Betrugsflygewicht hat einen intrinsischen Zustand. In diesem Beispiel repräsentiert eine intrinsische Eigenschaft des Charaktertyps, und sein Wert sollte zugewiesen werden, wenn das Enzyklopädie -Objekt erstellt wird. Alle intrinsischen Zustände ändern sich nicht, nachdem das Objekt erstellt wurde.
Wenn ein Opferobjekt einen externen Zustand hat, müssen alle externen Zustände am Kunden gespeichert werden. Bei Verwendung des Opferobjekts wird das Opferobjekt vom Klienten in das Opferobjekt übergeben. Hier gibt es nur einen externen Zustand, und der Parameterzustand der Operation () -Methode ist der externe Zustand von außen.
Public Class Concretflygewicht implementiert Flygewicht {privatcharakter intrinsicstate = null; / *** Konstruktor, der intrinsische Zustand wird als Parameter übergeben* @Param State*/ public concretflygewicht (Zeichenstatus) {this.intrinsicstate = Zustand; } /** * Der externe Zustand wird als Parameter in die Methode übergeben, wodurch das Verhalten der Methode * geändert wird, aber den intrinsischen Zustand des Objekts nicht verändert. */ @Override public void Operation (String State) {// Todo automatisch generierte Methode stub system.out.println ("Intrinsic State =" + this.intrinsicstate); System.out.println ("Extrinsic State =" + State); }}Für die Xiangyuan -Fabrikrollenklasse muss darauf hingewiesen werden, dass der Klient die spezifische Xiangyuan -Klasse nicht direkt instanziieren kann, sondern eine Fabrik () -Methode verwenden muss, um das Xiangyuan -Objekt zu erhalten. Im Allgemeinen gibt es im gesamten System nur ein Xiangyuan -Fabrikobjekt, sodass auch der Singleton -Modus verwendet werden kann.
Wenn der Kunde ein einfaches Genussobjekt benötigt, muss er die Fabrik () -Methode der Genussfabrik aufrufen und den erforderlichen internen Zustand der Genussfabrik weitergeben, und die Fabrikmethode generiert das erforderliche Genussobjekt.
public class flygewichtfactory {private map <charakter, flygewicht> files = new Hashmap <Zeichen, Flygewicht> (); public flyweight factory (Zeichenstatus) {// Suchen Sie zuerst nach dem Objekt aus dem Cache Flygewicht Fly = Dateien.get (Status); if (fly == null) {// Wenn das Objekt nicht existiert, erstellen Sie ein neues Flyweight -Objekt fly = new Concreteflygewicht (Zustand); // Fügen Sie dieses neue Fliegengewichtsobjekt in die Cache -Dateien hinzu.put (Status, Fly); } return fly; }}Kundenklasse
Public Class Client {public static void main (String [] args) {// Todo automatisch generierte Methode Stub FlyweightFactory Factory = new FlygewichtFactory (); Flygewicht fly = factory.factory (neuer Charakter ('a')); fly.operation ("erster Anruf"); fly = factory.factory (neuer Zeichen ('B')); fly.operation ("zweiter Anruf"); fly = factory.factory (neuer Charakter ('a')); fly.operation ("dritter Anruf"); }}Obwohl der Kunde drei Opferobjekte beantragte, gibt es nur zwei tatsächlich geschaffene Opferobjekte, was das Teilen bedeutet. Die Betriebsergebnisse sind wie folgt:
Komplexer Genussmodus
Im einfachen Genussmodus sind alle Genussobjekte einfache Genussobjekte, was bedeutet, dass sie direkt geteilt werden können. Es gibt auch eine kompliziertere Situation, in der ein einfacher extrinsischer Synthesemodus zu einem zusammengesetzten extrinsischen Objekt kombiniert wird. Solche zusammengesetzten Meta-dejoy-Objekte können nicht von sich aus geteilt werden, aber sie können in einfache Meta-genießende Objekte unterteilt werden, und letzteres kann geteilt werden.
Die an der Verbindung Xiangyuan beteiligten Zeichen sind wie folgt:
Abstract Flygewichtsrolle: Gibt eine abstrakte Schnittstelle an, um die Methoden anzugeben, die alle spezifischen Fliegengewichtsrollen implementiert werden müssen.
Rolle des Betrugsflygewichts: Implementiert die durch die abstrakte Xiangyuan -Rolle festgelegte Grenzfläche. Wenn es einen intrinsischen Zustand gibt, müssen Sie für den Speicherplatz für den intrinsischen Zustand verantwortlich sein.
CompositeCompositeFlygewicht -Rolle: Die von der Verbindungsanteil dargestellten Objekte können nicht geteilt werden, aber ein zusammengesetztes Aktienobjekt kann in mehrere Kombinationen von Objekten zerlegt werden, die einfach gemeinsame Objekte sind. Die zusammengesetzte extrinsische Rolle wird auch als ungeschütztes extrinsisches Objekt bezeichnet.
FlyweightFactory -Rolle: Diese Rolle ist für die Erstellung und Verwaltung der Xiangyuan -Rolle verantwortlich. Diese Rolle muss sicherstellen, dass das Genussobjekt vom System ordnungsgemäß geteilt werden kann. Wenn ein Kundenobjekt ein Xiangyuan -Objekt aufruft, prüft die Xiangyuan -Rolle, ob bereits ein Xiangyuan -Objekt vorhanden ist, das den Anforderungen im System entspricht. Wenn es bereits existiert, sollte die Xiangyuan -Fabrikrolle das bestehende Xiangyuan -Objekt liefern. Wenn es kein geeignetes Xiangyuan -Objekt im System gibt, sollte die Xiangyuan -Fabrikrolle ein geeignetes Xiangyuan -Objekt schaffen.
Quellcode
Abstrakte Charakterklasse
Der Parameterzustand ist der externe Zustand der öffentlichen Void -Operation (String -Status);}
Spezifische Genussrolleklasse
Public Class Concretflygewicht implementiert Flygewicht {privatcharakter intrinsicstate = null; / *** Konstruktor, der intrinsische Zustand wird als Parameter übergeben* @Param State*/ public concretflygewicht (Zeichenstatus) {this.intrinsicstate = Zustand; } /** * Der externe Zustand wird als Parameter in die Methode übergeben, wodurch das Verhalten der Methode * geändert wird, aber den intrinsischen Zustand des Objekts nicht verändert. */ @Override public void Operation (String State) {// Todo automatisch generierte Methode stub system.out.println ("Intrinsic State =" + this.intrinsicstate); System.out.println ("Extrinsic State =" + State); }}Das zusammengesetzte extrinsische Objekt besteht aus einem reinen extrinsischen Objekt durch Verbundung und bietet daher eine Aggregationsmanagementmethode wie add (). Da ein zusammengesetztes Meta -Objekt unterschiedliche Aggregatelemente aufweist, werden diese Aggregatelemente hinzugefügt, nachdem das zusammengesetzte Meta -Objekt erstellt wurde, dies bedeutet selbst, dass sich der Status des zusammengesetzten Meta -Objekts ändert, sodass das zusammengesetzte Meta -Objekt nicht gemeinsam genutzt werden kann.
Die zusammengesetzte extrinsische Rolle implementiert die Grenzfläche, die durch die abstrakte extrinsische Rolle angegeben ist, dh die Operation () -Methode. Diese Methode hat einen Parameter, der den externen Zustand des zusammengesetzten extrinsischen Objekts darstellt. Die externen Zustände aller Elemente eines zusammengesetzten Genussobjekts entsprechen dem externen Zustand des Composite -Genussobjekts. Während die internen Zustände des einfachen Genussobjekts in einem zusammengesetzten Genussobjekt im Allgemeinen nicht gleich sind, gibt es ansonsten keinen Nutzungswert.
öffentliche Klasse ConcreteCompositeFlyweight implementiert Flygewicht {private map <charakter, flygewicht> files = new Hashmap <Zeichen, Flygewicht> (); / *** Fügen Sie dem Cluster ein neues einfaches Metasparungsobjekt hinzu*/ public void add (Zeichenschlüssel, Fliegengewicht) {files.put (Schlüssel, Fliege); } / *** externer Zustand wird als Parameter in die Methode übergeben* / @Override public void Operation (String -Status) {Flygewicht fly = null; für (Objekt O: Dateien.keyset ()) {fly = files.get (o); fly.operation (Staat); }}} Die Xiangyuan -Fabrikrolle bietet zwei verschiedene Methoden, um ein einfaches Xiangyuan -Objekt und das andere für die Bereitstellung eines zusammengesetzten Xiangyuan -Objekts bereitzustellen.
public class flygewichtfactory {private map <charakter, flygewicht> files = new Hashmap <Zeichen, Flygewicht> (); / *** Verbindung Xiangyuan Factory Methode*/ Public Flyweight Factory (List <Scharakter> compositestate) {concreteCompositeFlyweight Compositefly = new ConcreteCompositeFlyweight (); für (Zeichenstatus: CompositState) {CompositeFly.Add (Zustand, this.factory (Zustand)); } return CompositeFly; } /*** Einfache Encyclopedia Factory -Methode* /public flyweight Factory (Zeichenstatus) {// Suchen Sie zuerst nach dem Objekt aus dem Cache Flygewicht fly = files.get (Status); if (fly == null) {// Wenn das Objekt nicht existiert, erstellen Sie ein neues Flyweight -Objekt fly = new Concreteflygewicht (Zustand); // Fügen Sie dieses neue Fliegengewichtsobjekt in die Cache -Dateien hinzu.put (Status, Fly); } return fly; }} Kundenrollen
public class Client {public static void main (String [] args) {list <Scharakter> compositestate = new ArrayList <Scharakter> (); compositestate.add ('a'); compositestate.add ('b'); compositestate.add ('c'); compositestate.add ('a'); compositestate.add ('b'); FlyweightFactory flyFactory = new Flygewichtfaktory (); Flyweight CompositeFly1 = FlyFactory.Factory (compositestate); Flyweight CompositeFly2 = FlyFactory.Factory (compositestate); CompositeFly1.operation ("Composite Call"); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------— flyfactory.factory (Status);Die Betriebsergebnisse sind wie folgt:
Aus den Betriebsergebnissen ist ersichtlich, dass der externe Zustand aller Elemente eines zusammengesetzten Genussobjekts dem externen Zustand des Composite -Genussobjekts entspricht. Das heißt, der externe Glückszustand entspricht dem zusammengesetzten Aufruf.
Aus den Betriebsergebnissen ist ersichtlich, dass die Konnotationszustände eines einfachen vorhandenen Objekts in einem zusammengesetzten vorhandenen Objekt im Allgemeinen ungleich sind. Das heißt, die inneren Zustände sind B, C und A.
Aus den laufenden Ergebnissen ist ersichtlich, dass das Composite -Share -Objekt nicht gemeinsam genutzt werden kann. Das heißt, das Objekt, das durch die Verwendung desselben Objekts über die Fabrik erstellt wurde, ist nicht dasselbe Objekt.
Aus den Betriebsergebnissen ist zu erkennen, dass einfach genießen kann, das Element zu genießen. Das heißt, das Objekt, das zweimal mit demselben Objektzustand über die Fabrik erstellt wurde, ist dasselbe Objekt.
Vor- und Nachteile des Xiangyuan -Modells
Der Vorteil des Enzyklopädie -Modus besteht darin, dass er die Anzahl der Objekte im Speicher stark reduziert. Der Preis, den es dafür lohnt, ist jedoch auch sehr hoch:
Der Enzyklopädie -Modus macht das System komplexer. Damit Objekte gemeinsam genutzt werden können, muss ein Staat externalisiert werden, was die Logik des Programms kompliziert.
Der Genussmodus externalisiert den Zustand des Genussobjekts, während das Lesen des externen Zustands die Laufzeit etwas länger macht.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.