Prototyp-Muster

Das Prototyp-Muster ist ein creational in der Softwareentwicklung verwendetes Designmuster, wenn der Typ von Gegenständen zu schaffen durch ein archetypisches Beispiel bestimmt wird, das geklont wird, um neue Gegenstände zu erzeugen. Dieses Muster ist gewöhnt an:

  • vermeiden Sie, dass Unterklassen eines Gegenstand-Schöpfers in der Client-Anwendung, wie das abstrakte Fabrikmuster tut.
  • vermeiden Sie die innewohnenden Kosten, einen neuen Gegenstand auf die Standardweise zu schaffen (z.B, mit dem 'neuen' Schlüsselwort), wenn es für eine gegebene Anwendung untersagend teuer ist.

Um das Muster durchzuführen, erklären Sie eine abstrakte Grundklasse, die einen reinen virtuellen Klon Methode angibt. Jede Klasse, die einen "polymorphen Konstrukteur" Fähigkeit braucht, leitet sich von der abstrakten Grundklasse ab, und führt den Klon Operation durch.

Der Kunde, anstatt Code zu schreiben, der den "neuen" Maschinenbediener auf einem hart codierten Klassennamen anruft, nennt den Klon Methode auf dem Prototyp, ruft eine Fabrikmethode mit einem Parameter, der den besonderen Beton benennt, hat Klasse gewünscht abgeleitet, oder ruft den Klon Methode durch einen durch ein anderes Designmuster zur Verfügung gestellten Mechanismus an.

Struktur

Beispiel

Das Prototyp-Muster gibt die Art von Gegenständen an, das Verwenden eines archetypischen Beispiels zu schaffen. Prototypen von neuen Produkten werden häufig vor der vollen Produktion gebaut, aber in diesem Beispiel ist der Prototyp passiv und nimmt am Kopieren von sich nicht teil. Die mitotic Abteilung einer Zelle - auf zwei identische Zellen hinauslaufend - ist ein Beispiel eines Prototyps, der eine aktive Rolle im Kopieren von sich und so spielt, das Prototyp-Muster demonstriert. Wenn sich eine Zelle, zwei Zellen des identischen Genotyp-Ergebnisses aufspaltet. Mit anderen Worten klont die Zelle sich.

Java

/ * *

* Prototyp-Klasse

*/

abstrakte Klasse Prototype führt Cloneable {\durch

@Override

öffentlicher Prototyp-Klon wirft CloneNotSupportedException {\

kehren Sie (Prototyp) super.clone zurück;

}\

öffentliche abstrakte Leere setX (interne Nummer x);

öffentliche abstrakte Leere printX ;

öffentliche abstrakte interne Nummer getX ;

}\/ * *

* Durchführung der Prototyp-Klasse

*/

Klasse PrototypeImpl erweitert Prototyp {\

interne Nummer x;

öffentlicher PrototypeImpl (interne Nummer x) {\

this.x = x;

}\

öffentliche Leere setX (interne Nummer x) {\

this.x = x; }\

öffentliche Leere printX {\

System.out.println ("Wert:" + x);

}\

öffentliche interne Nummer getX {\

geben Sie x zurück;

}\}\/ * *

* Kundencode

*/

öffentliche Klasse PrototypeTest {\

öffentliche statische leere Hauptsache (Spannen args []), wirft CloneNotSupportedException {\

Prototyp-Prototyp = neuer PrototypeImpl (1000);

für (interne Nummer i = 1; ich

C#

//Zeichen: In diesem Beispiel handelt ICloneable Schnittstelle (definiert im.Net Fachwerk) als Prototyp

Klasse ConcretePrototype: ICloneable

{\

öffentliche interne Nummer X {kommt; Satz; }\

öffentlicher ConcretePrototype (interne Nummer x)

{\

das. X = x;

}\

öffentlicher leerer PrintX

{\

Konsole. WriteLine ("Wert:" + X);

}\

öffentlicher Gegenstand-Klon

{\

geben Sie das zurück. MemberwiseClone ;

}\}\/ * *
  • Kundencode
  • /

öffentliche Klasse PrototypeTest

{\

öffentliche statische leere Hauptsache

{\

Var-Prototyp = neuer ConcretePrototype (1000);

für (interne Nummer i = 1; ich

PHP

}\

öffentliche Funktion printX

{\

drucken Sie sprintf ('Wert: %5d'. PHP_EOL, $this-> x);

}\

öffentliche Funktion setX ($p_valueX)

{\

$this-> x * = (int) $p_valueX;

}\

öffentliche Funktion __ Klon

{\

/ *

* ist Diese Methode für das Klonen, obwohl, wenn durchgeführt, nicht erforderlich

* wird PHP es nach dem Prozess auslösen, um Ihnen einen zu erlauben

* ändern sich in den geklonten Gegenstand.

*

* Verweisung:

http://php.net/manual/en/language.oop5.cloning.php

*/

//$this-> x = 1;

}\}\/ * * Kundencode/

$prototype = neuer ConcretePrototype (1000);

foreach (Reihe (1, 10) als $i) {\

$tempotype = klonen $prototype;

$tempotype-> setX ($i);

$tempotype-> printX ;

}\

/ *

  • Codeproduktion * *

Wert: 1000

Wert: 2000

Wert: 3000

Wert: 4000

Wert: 5000

Wert: 6000

Wert: 7000

Wert: 8000

Wert: 9000

Wert: 10000

/</Quelle>

Faustregeln

Manchmal Creational-Muster-Übergreifen - es gibt Fälle, wenn entweder Prototyp oder Abstrakte Fabrik passend sein würden. In anderen Zeiten ergänzen sie einander: Abstrakte Fabrik könnte eine Reihe von Prototypen versorgen, von denen man klont und Produktgegenstände (GoF, p126) zurückgibt. Abstrakte Fabrik, Baumeister und Prototyp können Singleton in ihren Durchführungen verwenden. (GoF, p81, 134).

Abstrakte Fabrikklassen werden häufig mit Fabrikmethoden durchgeführt (Entwicklung durch das Erbe), aber sie können mit dem Prototyp (Entwicklung durch die Delegation) durchgeführt werden. (GoF, p95)

Häufig beginnen Designs Verwenden-Fabrikmethode (weniger komplizierte, anpassbarere, Unterklassen wuchern), und entwickeln Sie sich zur Abstrakten Fabrik, dem Prototyp oder dem Baumeister (flexibler, komplizierter), weil der Entwerfer entdeckt, wo mehr Flexibilität erforderlich ist. (GoF, p136)

Prototyp verlangt das Subklassifizieren nicht, aber es verlangt wirklich eine "initialisieren" Operation. Fabrikmethode verlangt das Subklassifizieren, aber verlangt Initialisierung nicht. (GoF, p116)

Designs, die schweren Gebrauch der Zusammensetzungs- und Raumausstatter-Muster häufig machen, können aus Prototyp ebenso einen Nutzen ziehen. (GoF, p126)

Die Faustregel konnte darin bestehen, dass Sie einen Gegenstand würden klonen müssen, wenn Sie einen anderen Gegenstand an der Durchlaufzeit schaffen wollen, die eine wahre Kopie des Gegenstands ist, den Sie klonen. Wahre Kopie bedeutet, dass alle Attribute des kürzlich geschaffenen Gegenstands dasselbe als der Gegenstand sein sollten, den Sie klonen. Wenn Sie die Klasse realisiert haben könnten, indem Sie neu statt dessen verwendet haben, würden Sie einen Gegenstand mit allen Attributen als ihre Anfangswerte bekommen.

Zum Beispiel, wenn Sie ein System entwerfen, um Bankkonto-Transaktionen durchzuführen, dann würden Sie eine Kopie des Gegenstands machen wollen, der Ihre Kontoinformation hält, führen Sie Transaktionen darauf durch, und dann ersetzen Sie den ursprünglichen Gegenstand durch den modifizierten. In solchen Fällen würden Sie Klon statt des neuen verwenden wollen.

Siehe auch

  • Funktionsprototypen

Fabrikmethode-Muster / Zerlegbares Muster
Impressum & Datenschutz