Prototype原型模式是一種建立型設計模式,Prototype模式容許一個對象再建立另一個可定製的對象,根本無需知道任何如何建立的細節,工做原理是:經過將一個原型對象傳給那個要發動建立的對象,這個要發動建立的對象經過請求原型對象拷貝它們本身來實施建立。 ios
它主要面對的問題是:「某些結構複雜的對象」的建立工做;因爲需求的變化,這些對象常常面臨着劇烈的變化,可是他們卻擁有比較穩定一致的接口。 設計模式
#include "stdafx.h" #include<iostream> #include<vector> #include<assert.h> usingnamespace std; //父類 class Resume { protected: char *name; public: Resume() {} virtual ~Resume() {} virtual Resume* Clone() { return NULL; } virtualvoid Set(char *n) {} virtualvoid Show() {} }; class ResumeA : public Resume { public: ResumeA(constchar *str); //構造函數 ResumeA(const ResumeA &r); //拷貝構造函數 ~ResumeA(); //析構函數 ResumeA* Clone(); //克隆,關鍵所在 void Show(); //顯示內容 }; ResumeA::ResumeA(constchar *str) { if(str == NULL) { name = newchar[1]; name[0] = '\0'; } else { name = newchar[strlen(str)+1]; strcpy(name, str); } } ResumeA::~ResumeA() { delete [] name;} ResumeA::ResumeA(const ResumeA &r) { name = newchar[strlen(r.name)+1]; strcpy(name, r.name); } ResumeA* ResumeA::Clone() { returnnew ResumeA(*this); } void ResumeA::Show() { cout<<"ResumeA name : "<<name<<endl; } class ResumeB : public Resume { public: ResumeB(constchar *str); //構造函數 ResumeB(const ResumeB &r); //拷貝構造函數 ~ResumeB(); //析構函數 ResumeB* Clone(); //克隆,關鍵所在 void Show(); //顯示內容 }; ResumeB::ResumeB(constchar *str) { if(str == NULL) { name = newchar[1]; name[0] = '\0'; } else { name = newchar[strlen(str)+1]; strcpy(name, str); } } ResumeB::~ResumeB() { delete [] name;} ResumeB::ResumeB(const ResumeB &r) { name = newchar[strlen(r.name)+1]; strcpy(name, r.name); } ResumeB* ResumeB::Clone() { returnnew ResumeB(*this); } void ResumeB::Show() { cout<<"ResumeB name : "<<name<<endl; } class ResumeManager { private: vector<Resume *> mResume; public: ResumeManager() { } void add(Resume * resume) { mResume.push_back(resume); } Resume * get(int index) const { assert(index>=0 && index<mResume.size()); return mResume[index]; } }; int _tmain(int argc, _TCHAR* argv[]) { ResumeManager *manager = new ResumeManager(); Resume *r1 = new ResumeA("A"); Resume *r2 = new ResumeB("B"); manager->add(r1); manager->add(r2); manager->get(0)->Show(); manager->get(1)->Show(); Resume *r3 = manager->get(0)->Clone(); Resume *r4 = manager->get(1)->Clone(); //刪除r1,r2 delete r1; delete r2; r1 = r2 = NULL; //深拷貝因此對r3,r4無影響 r3->Show(); r4->Show(); delete r3; delete r4; r3 = r4 = NULL; return 0; }