プロトタイプモデルのプロトタイプの例では、作成するオブジェクトのタイプを指定し、 このプロトタイプをコピーして新しいオブジェクトを作成します
モデルの利点
- オブジェクトの作成を簡素化する
- 優れたスケーラビリティ
- シンプルな作成構造を提供します
- オブジェクトの状態はディープクローンに保存できます
モデルの欠点
- 各クラスにはクローンメソッドを装備する必要があり、メソッドはクラス内にあります。既存のクラスを変更する場合は、ソースコードを変更する必要があり、開閉の原則に違反します。
- ディープクローニングを実装する場合は、より複雑なコードを記述する必要があります
該当する環境
- 新しいオブジェクトの作成にはコストがかかります
- システムはオブジェクトの状態を保存する必要があり、オブジェクトの状態はほとんど変化しません
- オブジェクトを作成するために階層ファクトリクラスを使用することを避ける必要があります
- Ctrl + C、Ctrl + V
プロトタイプコード
/*
* @ Description: C++ Design Patterns___Prototype
* @ version: v1.0
* @ Author: WeissxJ
*/
#include<iostream>
#include<string>
class Prototype
{
public:
virtual ~Prototype() {
}
virtual Prototype* clone()=0;
virtual std::string type()=0;
// ...
};
class ConcretePrototypeA : public Prototype
{
public:
~ConcretePrototypeA() {
}
Prototype* clone(){
return new ConcretePrototypeA();
}
std::string type(){
return "type A";
}
// ...
};
class ConcretePrototypeB : public Prototype
{
public:
~ConcretePrototypeB() {
}
Prototype* clone(){
return new ConcretePrototypeB();
}
std::string type(){
return "type B";
}
// ...
};
class Client
{
private:
static Prototype* types[2];
static int n_types;
public:
static void init(){
types[0]=new ConcretePrototypeA();
types[1]=new ConcretePrototypeB();
}
static void remove(){
delete types[0];
delete types[1];
}
static Prototype* make(const int index){
if(index>=n_types){
return nullptr;
}
return types[index]->clone();
}
// ...
};
Prototype* Client::types[2];
int Client::n_types=2;
int main(){
Client::init();
Prototype* prototype1=Client::make(0);
std::cout<<"Prototype: "<<prototype1->type()<<std::endl;
delete prototype1;
Prototype* prototype2=Client::make(1);
std::cout<<"Prototype: "<<prototype2->type()<<std::endl;
delete prototype2;
Client::remove();
return 0;
}