原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式结构图
image原型模式基本代码
原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节。
#include <iostream>
#include <string>
#include "string.h"
using namespace std;
class Prototype { // 原型类
private:
string id;
char* str;
public:
virtual ~Prototype() {
delete[] str;
}
virtual Prototype* Clone() = 0;
Prototype(string i, char* s) {
id = I;
int len = strlen(s);
str = new char[len+1]; // 深度复制
cout << &str << endl; // 输出str的地址,作为对比
strcpy(str, s);
str[len] = '\0';
}
string GetId() { return id; }
char* GetStr() { return str; }
};
class ConcretePrototype1 : public Prototype {
public:
ConcretePrototype1(string id, char* s) : Prototype(id, s) {}
ConcretePrototype1(ConcretePrototype1& cp1) : Prototype(cp1.GetId(), cp1.GetStr()){} // 复制构造函数,实现深度复制
Prototype* Clone() {
return new ConcretePrototype1(*this);
}
};
class ConcretePrototype2 : public Prototype {
public:
ConcretePrototype2(string id, char* s) : Prototype(id, s) {}
ConcretePrototype2(ConcretePrototype2& cp2) : Prototype(cp2.GetId(), cp2.GetStr()){} // 复制构造函数,实现深度复制
ConcretePrototype2* Clone() {
return new ConcretePrototype2(*this);
}
};
int main() {
char* s = "Hello";
Prototype* p = new ConcretePrototype1("1", s); // 0x7f99ad501060
Prototype* c = p->Clone(); // 0x7f99ad501090
cout << c->GetId() << endl; // 1
cout << c->GetStr() << endl; // Hello
delete p;
delete c;
return 0;
}
网友评论