解析設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用
原型模式的意圖是用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。
適用性
當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過動(dòng)態(tài)裝載;或者
為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí);或者
當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。
關(guān)于這個(gè)模式,突然想到了小時(shí)候看的《西游記》,齊天大圣孫悟空再發(fā)飆的時(shí)候可以通過自己頭上的 3 根毛立馬復(fù)制出來成千上萬的孫悟空,對(duì)付小妖怪很管用(數(shù)量最重要)。
原型模式也正是提供了自我復(fù)制的功能,就是說新對(duì)象的創(chuàng)建可以通過已有對(duì)象進(jìn)行創(chuàng)建。在 C++中拷貝構(gòu)造函數(shù)(Copy Constructor)曾經(jīng)是很對(duì)程序員的噩夢(mèng),淺層拷貝和深層拷貝的魔魘也是很多程序員在面試時(shí)候的快餐和系統(tǒng)崩潰時(shí)候的根源之一。
結(jié)構(gòu)圖:
原型模式提供了一個(gè)通過已存在對(duì)象進(jìn)行新對(duì)象創(chuàng)建的接口(Clone),Clone()實(shí)現(xiàn)和具體的實(shí)現(xiàn)語言相關(guān),在 C++中我們將通過拷貝構(gòu)造函數(shù)實(shí)現(xiàn)之。
例子
注意事項(xiàng):
(1)根據(jù)原型模式的UML圖可以知道,實(shí)現(xiàn)要依賴于抽象要不要依賴與具體
(2)拷貝構(gòu)造函數(shù)是核心,而且針對(duì)c++要進(jìn)行的是深拷貝
(3)克隆函數(shù)的關(guān)鍵就是調(diào)用拷貝構(gòu)造函數(shù)
#include <iostream> using namespace std; class Student { protected: int id; char name[10]; public: Student() { } ~Student() { cout<<"Desconstuct...."<<endl; } virtual Student *Clone() {} virtual void Show() { } }; class StudentTypeA:public Student { public: StudentTypeA(const char *name_input) { strcpy(name, name_input); this->id = 0; cout<<"Construction....."<<endl; } StudentTypeA(const StudentTypeA&other) { cout<<"Copy Construction..."<<endl; this->id = other.id; this->id ++; strcpy(this->name, other.name); } virtual StudentTypeA *Clone() { StudentTypeA *tmp = new StudentTypeA(*this); return tmp; } void Show() { cout<<"Student id == "<< id << " name == "<< name <<endl; } ~StudentTypeA() { cout<<"Deconstruction StudentTypeA"<<endl; } }; int main() { Student *student1 = new StudentTypeA("fulima"); Student *student2 = student1->Clone(); Student *student3 = student2->Clone(); student1->Show(); student2->Show(); student3->Show(); return 0; }
- 全面解析設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn)
- C++設(shè)計(jì)模式編程中Facade外觀模式的使用實(shí)例解析
- 通過C++程序示例理解設(shè)計(jì)模式中的外觀模式
- C++設(shè)計(jì)模式編程中Template Method模板方法模式的運(yùn)用
- 詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用
- 實(shí)例講解C++編程中對(duì)設(shè)計(jì)模式中的原型模式的使用
- C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例
- 淺析設(shè)計(jì)模式中的代理模式在C++編程中的運(yùn)用
- C++編程中使用設(shè)計(jì)模式中的policy策略模式的實(shí)例講解
- 詳解C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用
相關(guān)文章
C++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)
這篇文章主要介紹了c++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)的相關(guān)資料,需要的朋友可以參考下2017-05-05一文帶你了解C語言中的動(dòng)態(tài)內(nèi)存管理函數(shù)
C語言中內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,這篇文章主要為大家講解一下這四個(gè)函數(shù)的具體用法,需要的可以參考一下2023-03-03c語言for、while和do-while循環(huán)之間的區(qū)別
大家好,本篇文章主要講的是c語言for、while和do-while循環(huán)之間的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01