原型模式在日常生活中比较常见,比如Ctrl+C/Ctrl+V、小学生抄作业等,其将一个某个对象复制N份,稍作修改形成一个新的对象,这就是原型模式。
class Prototype
{
public:
virtual ~Prototype()
{
}
virtual Prototype* clone() = 0;
protected:
Prototype()
{
}
};
class Student:public
Prototype
{
public:
Student()
{
}
~Student()
{
}
void setAge(int age)
{
miAge = age;
}
Prototype* clone()
{
return new Student(*this);
}
private:
int miAge;
};
void main()
{
Prototype* stu1 = new Student();
Prototype* stu2 = stu1->clone();
}
对于C++来说,原型函数跟赋值构造函数容易混淆
相同点:原型模式和拷贝构造函数都是要产生对象的复制品。
不同点:原型模式实现的是一个clone接口,注意是接口,也就是基于多态的clone虚函数。也就是说原型模式能够通过基类指针来复制派生类对象。拷贝构造函数完不成这样的任务。
原型模式的核心是克隆,构造函数只是克隆的一个办法而已。
1)T a1; T a2(a1); //使用a1对象来初始化a2对象,a2处于初始构造状态,因此调用拷贝构造函数;
2)T a1; T a2; a2 = a1; //a1赋值给a2的时候,a2已经构造完成了,因此调用拷贝赋值运算符;