Schöpfungsmuster: Prototyp

Dec 04 2022
In diesem Artikel wird erläutert, wie mithilfe des Prototypmusters aus vorhandenen Objekten neue Objekte erstellt werden können. Was ist es? Das Prototypmuster ist ein Kreationsmuster, bei dem neue Objekte durch Kopieren eines vorhandenen Objekts erstellt werden.

In diesem Artikel wird erläutert, wie mithilfe des Prototypmusters aus vorhandenen Objekten neue Objekte erstellt werden können.

Was ist es?

Das Prototypmuster ist ein Kreationsmuster, bei dem neue Objekte durch Kopieren eines vorhandenen Objekts erstellt werden. Das Objekt, dessen Kopien hergestellt werden, wird als Prototyp bezeichnet . Um Objekte besser zu verstehen, können Sie das Prototypobjekt als den „Samen“ betrachten, aus dem alle anderen Objekte erstellt werden. Sie könnten sich also fragen, warum Sie nicht bei Bedarf neue Objekte erstellen, anstatt vorhandene zu klonen. Die Beweggründe für Prototypobjekte sind wie folgt:

  • Manchmal ist das Erstellen eines neuen Objekts teurer als das Kopieren eines vorhandenen.
  • Stellen Sie sich vor, Sie könnten nicht statisch auf den Konstruktor einer Klasse zugreifen und die Laufzeitumgebung müsste eine Instanz jeder dynamisch geladenen Klasse erstellen. Stattdessen könnte die Anwendung Objekte von einem Prototyp-Manager anfordern , der Klone von Prototypen zurückgeben würde.
  • Sie können die Anzahl der Klassen in einem System erheblich reduzieren, indem Sie die Werte geklonter Objekte einer prototypischen Instanz variieren.

Klassen Diagramm

Das Klassendiagramm enthält die folgenden Entitäten:

  • Prototyp
  • Konkreter Prototyp
  • Klient

Nehmen wir das Beispiel eines Flugzeugs, um das Prototypmuster besser zu verstehen. Zuerst haben wir eine Klasse erstellt, um die F-16 darzustellen. Aber wir wissen, dass die F-16 einige Varianten hat. Um also jede der Varianten des F16 darzustellen, können wir Unterklassen erstellen. Aber dann haben wir am Ende mehrere Unterklassen in unserem System. Nehmen wir außerdem an, dass sich die F16-Varianten nur durch ihre Motortypen unterscheiden. Dann wäre eine Möglichkeit, eine einzelne F16-Klasse beizubehalten, aber eine Methode hinzuzufügen, um den Triebwerkstyp des Flugzeugs festzulegen. Auf diese Weise können wir ein einzelnes F16-Objekt als Prototyp erstellen und es für verschiedene Flugzeugversionen klonen.

Zuerst erstellen wir eine Schnittstelle.

Die Klasse F-16 implementiert ihre Schnittstelle wie folgt:

Der Client kann das Muster wie folgt verwenden:

Beachten Sie, dass die Methode clone der Schnittstelle IAircraftPrototype einen abstrakten Typ zurückgibt . Clients wissen nicht, welche unterschiedlichen Implementierungen derselben Schnittstelle konkrete Unterklassen erstellen werden. Beispielsweise kann die Boeing747- Klasse übergeben werden, wobei Kopien des übergebenen Prototyps hergestellt werden (eine F16 oder eine Boeing747). Das Prototypmuster hilft dabei, Unterklassen zu eliminieren, da das Verhalten von Prototypobjekten variiert werden kann, indem sie mit Unterteilen zusammengesetzt werden.

Flache vs. tiefe Kopie

Das Prototypmuster erfordert, dass die Prototypklasse oder -schnittstelle eine clone() -Methode implementiert. Das Klonen kann entweder flach oder tief sein. Wenn unsere F-16-Klasse beispielsweise ein Mitgliedsobjekt vom Typ F16Engine hat , würde das geklonte Objekt in einer flachen Kopie auf dasselbe F16Engine- Objekt wie der Prototyp zeigen. Aber in einer tiefen Kopie würde das geklonte Objekt seine Kopie seines Engine-Objekts und aller darin verschachtelten Objekte erhalten. Es gibt keine gemeinsame Nutzung von Feldern – verschachtelt oder anderweitig – zwischen dem Prototyp und seinem Klon.

Dynamisches Laden

Das Prototypmuster kann das dynamische Laden von Klassen erleichtern. Dynamisches Laden ermöglicht es Ihnen, eine Klasse zur Laufzeit zu laden, anstatt die Klasse zur Kompilierzeit verfügbar zu haben. In einer Sprache, die dynamisches Laden unterstützt, erstellt ein Framework eine Instanz der geladenen Klasse und registriert sie in einer Verwaltungseinheit. Dann kann Ihre Anwendung zur Laufzeit diesen Manager bitten, Ihnen ein Objekt zu geben, das zu dieser Klasse gehört.

Weitere Beispiele

In der Programmiersprache Java hat die Object-Klasse eine Clone-Methode. Die Klasse implementiert die Schnittstelle java.lang.Cloneable .

Vorbehalte

Die Implementierung der Klonmethode kann aufgrund von Zirkelverweisen schwierig sein.

Weitere Artikel in der Creational Pattern-Reihe