設計模式-原型模式

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章