用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这个其实和C++的拷贝构造函数的作用是一致的,实际上就是动态抽取当前对象运行时的状态。通
过已有对象的clone方法可以克隆一个当前对象,但是涉及到一些资源时(比如指针所指向的内存)不进行共享,换句话说就是深拷贝;如此说来,用原型实例指定创建对象的种
类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。下面是一个简单的实现:
#include<iostream>
#include<vector>
#include<list>
#include<fstream>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<stack>
#include <typeinfo>
#include<bitset>
#include<cstdio>
#include <stdarg.h>
#include<functional>
using namespace std;
class base{
protected:
char *ptr;
public:
base() {//默认构造函数
char *tmp = new char[1];
tmp[0] = '\0';//设置为0
}
virtual ~base() {//析构函数
delete[]ptr;
}
void set(char *ptr1){//重置指针
if (ptr1 == NULL){
delete[]ptr;
ptr = new char[1];
ptr[0] = '\0';
}
else{
delete[]ptr;
int size = strlen(ptr) + 1;
ptr = new char[size];
strcpy_s(ptr,size,ptr);
}
};
void Show() {//显示内容
cout << ptr << endl;
}
base* clone(){//克隆
return new base(*this);
};
base(const char *p){//带指针字符串的构造函数
int size = strlen(p)+1;
ptr = new char[size];
strcpy_s(ptr, size, p);//将目标串的非空字符完全拷贝过来,剩余空间置'\0'
}
base(const base &obj){//拷贝构造函数
int size = strlen(obj.ptr) + 1;
ptr = new char[size];
strcpy_s(ptr, size, obj.ptr);//将目标串的非空字符完全拷贝过来,剩余空间置'\0'
}
};
int main(){
base *p1 = new base("abcd");
base *p2 = new base("bcde");
base *p3 = p1->clone();//p1为原型进行深拷贝
base *p4 = p2->clone();
p1->Show();
p2->Show();
delete p1;
delete p2;
p3->Show();
p4->Show();
return 0;
}
<img src="https://img-blog.csdn.net/20161014173241021?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />