原型模式是一种对象创建型模式,该设计模式采取复制原型对象的方法来创建目标对象的实例,即使用原型模式创建的目标实例具有与原型一样的数据。
(1)由原型对象自身创建目标对象
(2)目标对象是原型的一个克隆(目标对象和原型对象具有相同的内存结果,相同的值)
注意,原型模式创建目标对象的实例,跟类的拷贝构造函数一样,涉及到深度拷贝、浅度拷贝问题。
原型模式适用于一个复杂的对象,具有自我复制的功能。将自我复制功能函数定义为基类的纯虚函数,这样继承自该基类的派生类的自我复制功能接口都是一致的,其UML图如下:
class Student
{
public:
virtual Student* clone() = 0;
virtual void print_info() = 0;
virtual ~Student() {} //将析构函数设置为虚函数,赋值兼容时可让派生类的调用自身的析构函数
};
class PrimaryStudent : public Student
{
public:
Student* clone() //返回本类对象的克隆版本
{
PrimaryStudent* tmp = new PrimaryStudent;
tmp->m_name = m_name;
tmp->m_age = m_age;
//深度拷贝
tmp->m_resume = new char[strlen(m_resume) + 1];
memcpy(tmp->m_resume, m_resume, strlen(m_resume));
return tmp;
}
void print_info()
{
cout << "name: " << m_name << endl;
cout << "age: " << m_age << endl;
cout << "resume: " << m_resume << endl;
}
PrimaryStudent(string name = "", char age = 0, const char* resume = "")
: m_name(name), m_age(age), m_resume(new char[strlen(resume) + 1])
{
memcpy(m_resume, resume, strlen(resume));
}
//析构函数
~PrimaryStudent() {delete[] m_resume; }
private:
string m_name;
int m_age;
char* m_resume;
};
int main(void)
{
PrimaryStudent *ps1 = new PrimaryStudent("gir", 12, "hello_world");
ps1->print_info();
//将*ps1对象克隆至*ps2对象。clone()返回的是基类指针,所以通过ps2只能访问基类的成员
Student *ps2 = ps1->clone();
ps2->print_info();
delete ps2;
delete ps1;
return 0;
}
编译运行: