一、简介
原型模式可以用于创建重复的对象,同时又能保证性能。原型模式是一种创建型模式,提供一种创建对象的最佳方式。
二、原型模式实例
某小学要在六一儿童节这天公布一批三好学生,需要一批奖状。我们知道,三好学生的奖状上一般除了班级姓名其他都是相同的内容。在这种情景下,学校只需要设计一张奖状原型出来,剩余奖状都可以进行拷贝和简单的变更。
这个情景就非常适合使用原型模式解决。
1)原型类-奖状类,提供克隆自己的接口clone,用于返回克隆了自身属性的新对象指针
class Cert
{
public:
//构造函数
Cert() {}
//拷贝构造函数
Cert(Cert* cert)
{
_printing = cert->_printing;
_text = cert->_text;
_studentName = cert->_studentName;
}
void SetCert(string printing, string text)
{
_printing = printing;
_text = text;
}
//设置学生姓名
void SetStudentName(string name)
{
_studentName = name;
}
void show()
{
cout << "这张奖状的印花:" << _printing << endl;
cout << "这张奖状的文本:" << _text << endl;
cout << "这张奖状发给谁:" << _studentName << endl;
}
//克隆接口
Cert* clone()
{
return new Cert(*this);
}
private:
string _printing; //印花
string _text; //奖状文本
string _studentName; //学生名字
};
2)使用
int main(int argc, char *argv[])
{
//老师选择制作一张奖状,作为张三的奖状
Cert *certA = new Cert();
certA->SetCert("三好学生印花", "恭喜获得本学期三好学生,望继续努力!");
certA->SetStudentName("张三");
certA->show();
cout << endl;
//老师复制了张三的奖状,只需要把名字改成李四
Cert *certB = certA->clone();
certB->SetStudentName("李四");
certB->show();
}
可见,certB是certA的克隆对象,除了一些定制的内容(学生姓名),其他都不需要再次调用SetCert设置奖状细节。既不容易出错,又减少了程序的复杂度,同时,由于不用反复调用填充对象的属性,提高了程序的效率。