Prototyp und Muster

Anstatt eine Unterklasse zu instanziieren, die einer Konfiguration entspricht, kann der Client einfach nach einem geeigneten Prototyp suchen und ihn klonen. Anstatt Code zu schreiben, der den “neuen” Operator für einen hartcodierten Klassennamen aufruft, ruft der Client die clone()-Methode für den Prototyp auf, ruft eine Factorymethode mit einem Parameter auf, der die gewünschte konkrete abgeleitete Klasse bezeichnet, oder ruft die clone()-Methode über einen Mechanismus auf, der von einem anderen Entwurfsmuster bereitgestellt wird. Prototyp ermöglicht es uns, die Komplexität der Erstellung neuer Instanzen aus dem Client zu verbergen. Das Konzept besteht darin, ein vorhandenes Objekt zu kopieren, anstatt eine neue Instanz von Grund auf neu zu erstellen, was kostspielige Vorgänge umfassen kann. Das vorhandene Objekt fungiert als Prototyp und enthält den Status des Objekts. Das neu kopierte Objekt kann dieselben Eigenschaften nur bei Bedarf ändern. Dieser Ansatz spart kostspielige Ressourcen und Zeit, insbesondere wenn die Objekterstellung ein schwerer Prozess ist. Designs, die Composite und Decorator stark nutzen, können oft von der Verwendung von Prototypen profitieren. Durch anwenden des Musters können Sie komplexe Strukturen klonen, anstatt sie von Grund auf neu zu konstruieren.

1) Prototyp : Dies ist der Prototyp des tatsächlichen Objekts. Bei der heutigen Programmierung geht es um Kosten. Sparen ist ein großes Problem, wenn es um die Verwendung von Computerressourcen geht, also tun Programmierer ihr Bestes, um Wege zur Verbesserung der Leistung zu finden. Wenn wir über Objekterstellung sprechen, können wir einen besseren Weg finden, um neue Objekte zu haben: Klonen. Mit dieser Idee ist ein bestimmtes Designmuster verwandt: Anstatt zu erstellen, wird das Klonen verwendet. Wenn die Kosten für das Erstellen eines neuen Objekts groß und die Erstellung ressourcenintensiv ist, klonen wir das Objekt. Verwenden Sie das Muster, wenn Sie die Anzahl der Unterklassen reduzieren möchten, die sich nur in der Art und Weise unterscheiden, wie sie ihre jeweiligen Objekte initialisieren. Jemand hätte diese Unterklassen erstellen können, um Objekte mit einer bestimmten Konfiguration erstellen zu können. Im obigen UML-Klassendiagramm instanziiert die Clientklasse, die ein Product-Objekt erfordert, die Product1-Klasse nicht direkt. Stattdessen verweist der Client auf die Prototype-Schnittstelle zum Klonen eines Objekts.

Die Product1-Klasse implementiert die Prototype-Schnittstelle, indem sie eine Kopie von sich selbst erstellt. Das UML-Sequenzdiagramm zeigt die Laufzeitinteraktionen: Das Clientobjekt ruft clone() für ein prototyp:Product1-Objekt auf, das eine Kopie von sich selbst erstellt und zurückgibt (ein product:Product1-Objekt). Verwenden Sie das Muster Prototyp, wenn der Code nicht von den konkreten Klassen von Objekten abhängen soll, die Sie kopieren müssen. Nehmen wir das Beispiel, das wir vorhin erwähnt haben, und fahren Sie fort, um zu sehen, wie sie das Prototypmuster anwenden, ohne die Cloneable-Schnittstelle zu verwenden. Um dies zu tun, erstellen wir eine abstrakte Klasse namens Tree mit einer abstrakten Methode `copy`. Im Diagramm sehen wir, dass der Client dem Prototyp sagt, er solle sich selbst klonen und ein Objekt erstellen. Prototyp ist eine Schnittstelle und deklariert eine Methode zum Klonen selbst. ConcretePrototype1 und ConcretePrototype2 implementieren den Vorgang, um sich selbst zu klonen. (Der Suchalgorithmus ist nicht optimiert; er ist ein grundlegender Algorithmus zur Veranschaulichung der Musterimplementierung) Die Clone-Methode verwendet immer noch neu, um das Objekt zu korrigieren. Sie erfüllt nicht die Entwurfsmusteranforderung. Das Muster verwendet abstrakte Klassen, wie wir unten sehen werden, und nur drei Klassentypen machen die Implementierung ziemlich einfach.

Das Prototypmuster ist ein Kreationsmuster in der Softwareentwicklung. Sie wird verwendet, wenn der Typ der zu erstellenden Objekte durch eine prototypische Instanz bestimmt wird, die geklont wird, um neue Objekte zu erzeugen.