原型模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。
原型模式包含:
- 抽象原型类:规定了具体原型对象必须实现的接口。
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
- 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
具体应用:学校奖状设计。
第一步:具体原型类
代码语言:javascript复制class Info
{
public:
Info(){}
string getDate(){return schooldate;}
string getClass(){return schoolclass;}
void setDate(string Date){schooldate=Date;}
void setClass(string _class){schoolclass=_class;}
//子类必须要实现所有父类的虚函数,子类才能实例化对象
//奖学金原型克隆
Info* Clone()
{
Info *info=new Info();
*info=*this;
return info;
}
private:
string schooldate;
string schoolclass;
};
第二步:抽象原型类
代码语言:javascript复制//原型类,声明一个克隆自身的接口
class Certificate
{
public:
Certificate(){}
virtual void Display()=0;
virtual void SetInfo(string name,string sex,string college)=0;
virtual void SetSchoolInfo(string data,string class_)=0;
virtual Certificate* Clone()=0;
protected:
string name;
string sex;
string college;
};
第三步:访问接口
代码语言:javascript复制class Citation:public Certificate
{
public:
Citation()=default;
//对接口函数的额实现
void SetInfo(string name,string sex,string college)
{
this->name=name;
this->sex=sex;
this->college=college;
}
void SetSchoolInfo(string data,string class_)
{
_info->setDate(data);
_info->setClass(class_);
}
void Display()
{
cout<<name<<" "<<sex<<" "<<college<<"n";
cout<< _info->getDate()<<" "<<_info->getClass()<<endl;
}
//克隆自身的接口实现
Certificate* Clone()override
{
Citation *clonecitation=new Citation(_info);
clonecitation->name=this->name;
clonecitation->sex=this->sex;
clonecitation->college=this->college;
return clonecitation;
}
private:
Info *_info=new Info();
explicit Citation(Info *info):_info((Info*)info->Clone()){}
};
第四步:主函数
代码语言:javascript复制#include "st.h"
int main()
{
Citation *a = new Citation();
a->SetInfo("王大大", "男", "机械学院");
a->SetSchoolInfo("2020年第一学期", "荣获一等奖");
a->Display();
cout<<endl;
//孙悟空拔侯毛
Citation *b = (Citation*)a->Clone();
b->SetInfo("李小小", "女", "文法学院");
b->SetSchoolInfo("2019年第一学期", "荣获一等奖");
b->Display();
return 0;
}
结果显示: