2016-03-11 39 views
5

プロトタイプデザインパターンをいつ使うべきかを理解しようとしています。私はそれを理解するようここ は、プロトタイプの例である:C++のプロトタイプデザインパターンとコピーコンストラクタの違い

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

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

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

はどこに質問です: よりもなぜこの優れた:

class Obj 
{ 
public: 
    Obj(); 

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

Obj o; 
Obj o2 = o; 

だから私は実際にプロトタイプを使用する必要があるとき?

+2

コード 'class ConcretePrototype'は':public Prototype'コードで拡張する必要があります – nikniknik2016

+2

質問は "車と象の違いは何ですか?" –

+0

@πάνταῥεῖ1つは灰色です。もうひとつは、もしあなたが味わいがあれば、そうではありません。 :) –

答えて

8

コピーコンストラクタは、言語の要素です。

プロトタイプは、いくつかの既存のインスタンスに基づくオブジェクト(ポリモフィック)を生成するために使用されるデザインパターンです。

オブジェクトの正確なインスタンスを知るとき、コピーコンストラクタが使用されることが意図され、後者を実装するために、元を使用することは困難であろうプロトタイプが使用されている間、いくつかのインタフェースの任意の可能な実装があるかもしれないとき、あなた奇妙なキャストとチェックメソッドに頼らずに、まったく同じ実装の新しいオブジェクトを取得したいだけです。

インターフェイスIと実装ABがあるとします。ある時点で、オブジェクトiIを実装しています。おそらく、あなたはそれを変更したくないかもしれませんが、代わりに新しいインスタンスを取得し、それにいくつかの変更を導入することを好むでしょう。 iの正確なクラスがわからないとき、どのように達成できますか?プロトタイプパターンは、その問題の1つの解決策です:I* i2 = i.clone();。ここで

+0

ええ、これは本当に素晴らしい説明です。ありがとう! –

4

はGoF本からの参照である:プロトタイプのクローンを作成

クライアントは、彼らの具象サブクラスについて知っている必要はありません。 Cloneの戻り値を目的のタイプにダウンキャストする必要はありません。あなたの例については

Example of Prototype design pattern

、クライアントは認識していない(またはアクセスすることはできません)ConcretePrototypeの。

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

このパターンが有用であることを理解していただきたいと思います。また、覚えておいてください、no virtual constructorがあります。

関連する問題