简介
原型模式虽然是创建型的模式,但是与工厂模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
角色与职责
Protoytpe:抽象接口
ConcretePrototype:具体实现类,注意针对指针时深拷贝和浅拷贝的问题。
使用范围
一个复杂对象,具有自我复制功能,统一一套接口。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建
新的对象。
实例
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
virtual Person* clone() = 0;
virtual void printT() = 0;
};
class CPPProgrammer : public Person {
public:
CPPProgrammer() :m_name(""), m_age(0) {
setResume("aa");
}
CPPProgrammer(string name, int age, char* resume) :m_name(name), m_age(age) {
setResume(resume);
}
// 重载=实现深拷贝
CPPProgrammer& operator=(const CPPProgrammer& p) {
if (&p != this) { // 防止自我赋值
if (m_resume != NULL) {
delete m_resume;
m_resume = NULL;
}
m_name = p.m_name;
m_age = p.m_age;
m_resume = new char[strlen(p.m_resume) + 1];
strcpy(m_resume, p.m_resume);
}
return *this;
}
void setResume(const char* resume) {
if (m_resume != NULL) {
delete m_resume;
}
m_resume = new char[strlen(resume) + 1];
strcpy(m_resume, resume);
}
virtual void printT() {
cout << "name : " << m_name << " age : " << m_age << " m_resume : " << m_resume << endl;
}
virtual Person* clone() {
CPPProgrammer* tem = new CPPProgrammer;
// 浅拷贝
*tem = *this;
// 深拷贝,因为重载=函数预防了自我赋值
return tem;
}
private:
string m_name;
int m_age;
char* m_resume;
};
int main(int argc, char* argv[]) {
Person* p1 = new CPPProgrammer("张三", 18, "中国人");
p1->printT();
Person* p2 = p1->clone();
p2->printT();
cin.get();
return 0;
}