原型模式:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1 假设我们现有一个对象,但是它的类型需要运行期确定,我们不知道它的动态类型是什么,现在我们想创建它的副本。显然通过构造函数创建是很麻烦的,这时候我们可以使用原型模式中的clone函数直接得到该对象的副本。
2 有些时候我们想要得到某个状态下的副本,用构造函数显然很难确定参数应该是什么,但是利用clone可以轻易得到副本。
3 拷贝需要采用深拷贝,保证副本的改变不会影响原始版本和其他副本。原始版本丢失也不会影响副本。
#include<iostream>
#include<cstring>
using namespace std;
class Prototype{
public:
virtual ~Prototype(){}
virtual Prototype* clone()=0;
virtual void show(){}
};
class ConcretePrototype1:public Prototype{
public:
ConcretePrototype1(){
value=0;
name=new char[1];
name='\0';
}
ConcretePrototype1(int v,const char* n){
value=v;
name=new char[strlen(n)+1];
strcpy(name,n);
}
ConcretePrototype1(const ConcretePrototype1& rhs){
value=rhs.value;
name=new char[strlen(rhs.name)+1];
strcpy(name,rhs.name);
}
~ConcretePrototype1(){
delete []name;
name=NULL;
}
ConcretePrototype1* clone() override{
ConcretePrototype1* pConcretePrototype1=new ConcretePrototype1(*this);
return pConcretePrototype1;
}
void show(){
cout<<value<<" "<<name<<endl;
}
private:
int value;
char* name;
};
int main(){
Prototype* pPrototype=new ConcretePrototype1(24,"Lilei");
//假设在此之后我们不知道pPrototype的动态类型
//我们可以使用原型模式克隆出一个该动态类型的对象
Prototype* clone1=pPrototype->clone();
Prototype* clone2=pPrototype->clone();
Prototype* clone3=pPrototype->clone();
pPrototype->show();
delete pPrototype;pPrototype=NULL;//深拷贝,所以删除原型后对克隆版本无影响
clone1->show();
clone2->show();
clone3->show();
delete clone1;clone1=NULL;
delete clone2;clone2=NULL;
delete clone3;clone3=NULL;
}