用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。這個其實和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="" />