2016-03-11 13 views
5

Ich versuche zu verstehen, wenn ich Prototyp Design-Muster verwenden sollte. Hier ist Beispiel für Prototype wie ich es verstehe:Was den Unterschied zwischen Prototyp Entwurfsmuster und Kopie Konstruktor in C++

class Prototype 
{ 
public: 
    virtual Prototype* clone() = 0; 
... 
}; 

class ConcretePrototype : public Prototype 
{ 
public: 
    Prototype* clone() override { ... } 
}; 

// Usage: 
ConcretePrototype proto; 
auto protPtr = proto.clone(); 

Wo ist eine Frage: Warum dies besser als:

class Obj 
{ 
public: 
    Obj(); 

    Obj(const Obj&); 
    Obj& operator = (const Obj& other); 
}; 

Obj o; 
Obj o2 = o; 

Also, wenn ich sollte eigentlich Prototype verwenden?

+2

Der Code 'Klasse ConcretePrototype' muss um den': public Prototype'-Code erweitert werden – nikniknik2016

+2

Die Frage klingt ein bisschen wie "Was ist der Unterschied zwischen einem Auto und einem Elefanten?" –

+0

@ πάνταῥεῖ Eins ist grau. Der andere, wenn Sie überhaupt Geschmack haben, ist nicht. :) –

Antwort

8

Kopierkonstruktor ist ein Element der Sprache.

Prototyp ist ein Entwurfsmuster, das verwendet wird, um (polymorphe) Objekte zu erzeugen, die auf einer vorhandenen Instanz basieren.

Es wäre schwierig, den ersteren zu verwenden, um die letztere zu implementieren als Copykonstruktor soll verwendet werden, wenn genaue Instanz des Objekts zu kennen, während Prototyp verwendet, wenn es jede mögliche Implementierung einiger Schnittstelle sein könnte und Sie Ich möchte einfach ein neues Objekt mit genau der gleichen Implementierung erhalten, ohne auf einige seltsame Casting- und Prüfmethoden zurückgreifen zu müssen.

Nehmen wir an, Sie haben die Schnittstelle I und die Implementierungen A und B. Zu einem bestimmten Zeitpunkt erhalten Sie das Objekt i, das I implementiert. Vielleicht möchten Sie es nicht ändern, stattdessen möchten Sie lieber eine neue Instanz erhalten und dann eine Änderung vornehmen. Wie kann das erreicht werden, wenn Sie keine genaue Klasse von i kennen? Prototyp-Muster ist eine Lösung für dieses Problem: I* i2 = i.clone();.

+0

Ja, das ist wirklich eine großartige Erklärung. Vielen Dank! –

4

ist hier Bezug von GoF Buch:

Clients, die den Prototyp klonen müssen über ihre konkreten Subklassen nicht kennen. Clients sollten den Rückgabewert von Clone nie auf den gewünschten Typ verkleinern müssen.

Example of Prototype design pattern

Für Sie zum Beispiel, ist der Kunde nicht bewusst (oder können den Zugang nicht) von ConcretePrototype.

// Usage: 
SomeMethod(PrototypeInterface iproto) // Thanks Prototype pattern 
{ 
    // ConcretePrototype proto;  
    auto protPtr = iproto.clone(); // Gets correct object without calling concrete object's constructor explicitly. 
} 

Ich hoffe, Sie haben die Situation verstanden, wenn dieses Muster nützlich ist. Auch daran erinnern, gibt es no virtual constructor.

Verwandte Themen