原型模式,产生一份简历,其他简历从该简历进行clone,所以当这份简历改变后,之后clone的简历都会有所改变,这份简历就是原型。注意:原型模式涉及浅拷贝和深拷贝。代码示例如下:
/**
* @file resume.h
* @brief prototype pattern
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#ifndef RESUME_HPP
#define RESUME_HPP
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
class Resume {
protected:
char *name;
public:
Resume() {}
virtual ~Resume() {}
virtual Resume* clone() { return NULL; }
virtual void set(const char* str) {}
virtual void show() {}
};
class ResumeA : public Resume {
public:
ResumeA(const char *str);
ResumeA(const ResumeA &r);
~ResumeA();
ResumeA* clone();
void set(const char *str);
void show();
};
ResumeA::ResumeA(const char *str) {
if (str == NULL) {
name = new char[1];
name[0] = '\0';
} else {
name = new char[strlen(str) + 1];
strcpy(name, str);
}
}
ResumeA::~ResumeA() {
delete[] name;
}
ResumeA::ResumeA(const ResumeA &r) {
name = new char[strlen(r.name) + 1];
strcpy(name, r.name);
}
ResumeA* ResumeA::clone() {
return new ResumeA(*this);
}
void ResumeA::set(const char* str) {
if (name) {
delete[] name;
}
if (str == NULL) {
name = new char[1];
name[0] = '\0';
} else {
name = new char[strlen(str) + 1];
strcpy(name, str);
}
}
void ResumeA::show() {
cout << "resume name: " << name << endl;
}
#endif
/**
* @file main.cpp
* @brief main
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#include "resume.h"
int main() {
Resume* r1 = new ResumeA("zhangsan");
Resume* r2 = r1->clone();
Resume* r3 = r1->clone();
cout << "r1 name: ";
r1->show();
cout << "r2 name: ";
r2->show();
cout << "r3 name: ";
r3->show();
r1->set("lisi");
Resume* r4 = r1->clone();
Resume* r5 = r1->clone();
cout << "r1 name: ";
r1->show();
cout << "r4 name: ";
r4->show();
cout << "r5 name: ";
r5->show();
return 0;
}
输出: