Prototyp-Muster
Das Prototyp-Muster wird verwendet, um Objekte zu duplizieren, während die Leistung sichergestellt wird. Diese Art von Entwurfsmuster gehört zu den Erzeugungsmustern und bietet eine der besten Möglichkeiten, Objekte zu erstellen.
Dieses Muster implementiert eine Prototyp-Schnittstelle, die verwendet wird, um einen Klon des aktuellen Objekts zu erstellen. Dieses Muster wird verwendet, wenn das direkte Erstellen eines Objekts relativ aufwendig ist. Beispielsweise muss ein Objekt nach einer teuren Datenbankoperation erstellt werden. Wir können das Objekt zwischenspeichern, bei der nächsten Anfrage seinen Klon zurückgeben und die Datenbank bei Bedarf aktualisieren, wodurch Datenbankaufrufe reduziert werden.
summary
Prototyp-Muster
Absicht: Verwenden Sie Prototyp-Instanzen, um die Arten von Objekten anzugeben, die erstellt werden sollen, und erstellen Sie neue Objekte durch Kopieren dieser Prototypen.
Hauptsächlich gelöst: Prototypen zur Laufzeit dynamisch erstellen und löschen.
Wann verwenden
- Das System sollte unabhängig von der Erzeugung, Zusammensetzung und Darstellung von Produkten sein.
- Die zu instanziierende Klasse muss zur Laufzeit angegeben werden, beispielsweise durch dynamisches Laden.
- Vermeiden Sie die Erstellung einer Factory-Klassenhierarchie parallel zur Produktklassenhierarchie.
- Instanzen einer Klasse können nur wenige verschiedene Zustandskombinationen haben; das Klonen eines Prototyps ist bequemer als die manuelle Instanziierung.
Lösung
Schnelles Erzeugen einer Instanz, die mit dem Prototypobjekt identisch ist, durch Verwendung eines vorhandenen Prototypobjekts.
Schlüsselcode
- Implementieren Sie die Clone-Operation:
- In Java implementieren
CloneableInterface, überschreibenclone()Methode. - In .NET verwenden
ObjectKlasseMemberwiseClone()Die Methode implementiert flache Kopie oder tiefe Kopie mittels Serialisierung.
- In Java implementieren
- Isolieren Sie die Kopplung zwischen Benutzern von Klassenobjekten und konkreten Typen, wobei "volatile Klassen" stabile Schnittstellen haben müssen.
Anwendungsbeispiel
- Zellteilung
- In Java
Object.clone()Methoden
Vorteile
- Leistungsverbesserung
- Konstruktorbeschränkungen vermeiden
Nachteile
- Das Ausstatten einer Klasse mit Clone-Methoden erfordert eine umfassende Berücksichtigung der Funktionalität der Klasse, was bei bestehenden Klassen schwierig sein kann, insbesondere beim Umgang mit indirekten Objekten, die keine Serialisierung unterstützen, oder Verweisen, die zirkuläre Strukturen enthalten.
- Muss implementiert werden
CloneableSchnittstelle.
Anwendungsfall
- Ressourcenoptimierung
- Wenn die Klasseninitialisierung eine große Menge an Ressourcen verbraucht (z. B. Daten, Hardware-Ressourcen).
- Szenarien mit hohen Leistungs- und Sicherheitsanforderungen
- Durch
newWenn das Erstellen eines Objekts komplexe Datenvorbereitung oder Zugriffsberechtigungen erfordert. - Ein Objekt erfordert mehrere Modifizierer
- Wenn ein Objekt anderen Objekten zum Zugriff bereitgestellt werden muss und von verschiedenen Aufrufern geändert werden kann.
- Es wird häufig zusammen mit dem Factory-Method-Muster verwendet, durch
clonedas Erstellen von Objekten, die dann von der Factory-Methode an Aufrufer übergeben werden.
Hinweise
Im Gegensatz zum direkten Instanziieren einer Klasse, um ein neues Objekt zu erstellen, erzeugt das Prototype-Muster neue Objekte durch Kopieren vorhandener Objekte. Eine flache Kopie wird durch Implementieren vonCloneablewährend eine tiefe Kopie durch Implementieren vonSerializableLesen von binären Streams.
Struktur
Das Prototype-Muster umfasst die folgenden Hauptrollen:
Prototype-Schnittstelle: Definiert eine Schnittstelle zum Klonen von sich selbst, üblicherweise einschließlich einer
clone()Methode.Konkreter Prototyp: Eine konkrete Klasse, die die Prototype-Schnittstelle implementiert und für die eigentliche Klonoperation verantwortlich ist. Diese Klasse muss die
clone()Methode, die üblicherweise eine flache Kopie oder eine tiefe Kopie verwendet, um sich selbst zu kopieren.Client: Verwenden Sie Prototypinstanzen, um neue Objekte zu erstellen. Der Client ruft die
clone()Methode des Prototypobjekts auf, um neue Objekte zu erstellen, anstatt direkt Konstruktoren zu verwenden.
Implementierung
Wir werden eine abstrakte KlasseShapeerstellen und konkrete Klassen, dieShapeerweitern. Der nächste Schritt ist die Definition der KlasseShapeCache, diese Klasse speichert Shape-Objekte in einerHashtableund gibt deren Klone auf Anfrage zurück.
PrototypePatternDemoKlasse verwendet dieShapeCache-Klasse, um einShape-Objekt zu erhalten.
Schritt 1
Erstelle eine abstrakte Klasse, dieCloneableimplements das Interface.
Shape.java
Schritt 2
Erstellen Sie Entitätsklassen, die die obige abstrakte Klasse erweitern.
Rectangle.java
Square.java
Circle.java
Schritt 3
Erstellen Sie eine Klasse, die Entitätsklassen aus einer Datenbank abruft und sie in einerHashtableIn.
ShapeCache.java
Schritt 4
PrototypePatternDemoVerwendungShapeCacheKlasse zum Abrufen des inHashtablegespeicherten Prototyps, der Kopie der darin enthaltenen Form.
PrototypePatternDemo.java
Schritt 5
Führen Sie das Programm aus, Ausgabeergebnis:
Shape : Circle Shape : Square Shape : RectangleWeitere Erweiterungen