1. 首先分析原型模式的由來
一般來說,創建一個對象可以由以下方法:
知道對象的具體類型,直接用new生成。
不知道型號,知道相應的需求,可以使用工廠方法模式。
根據一個已有的對象來複製爲一個新的對象,可以使用原型模式。
2. 原型模式可以簡單理解爲拷貝原型對象得到新的對象。想象一個配鑰匙的小店,給店主一個原有的鑰匙,複製一份新的。在原型模式中,得到的新的對象可以進行修改再返回給用戶。
3. UML圖
4. 示例實現代碼
#include <iostream>
using namespace std;
//原型類,聲明一個Clone的接口
class Protetype
{
public:
Protetype(){}
virtual ~Protetype(){}
virtual Protetype* Clone()=0; //聲明接口
};
//具體的原型類-1
class ConcreteProtetype1:public Protetype
{
public:
ConcreteProtetype1(){cout<<"Constructed a protetype1!"<<endl;}
virtual ~ConcreteProtetype1(){cout<<"Deleted a protetype1!"<<endl;}
Protetype* Clone()
{
return new ConcreteProtetype1(*this); //拷貝一份對象返回,調用了拷貝構造函數
}
};
//具體的原型類-2
class ConcreteProtetype2:public Protetype
{
public:
ConcreteProtetype2(){cout<<"Constructed a protetype2!"<<endl;}
virtual ~ConcreteProtetype2(){cout<<"Deleted a protetype2!"<<endl;}
Protetype* Clone()
{
return new ConcreteProtetype2(*this); //拷貝一份對象返回
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Protetype* p1=new ConcreteProtetype1;
Protetype* p2=p1->Clone();
delete p1;
delete p2;
Protetype* p3=new ConcreteProtetype1;
ConcreteProtetype2* p4=(ConcreteProtetype2*)p3->Clone();
delete p3;
delete p4;
return 0;
}