解析設計模式中的Prototype原型模式及在C++中的使用
原型模式的意圖是用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
適用性
當要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載;或者
為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時;或者
當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。建立相應數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。
關于這個模式,突然想到了小時候看的《西游記》,齊天大圣孫悟空再發(fā)飆的時候可以通過自己頭上的 3 根毛立馬復制出來成千上萬的孫悟空,對付小妖怪很管用(數(shù)量最重要)。
原型模式也正是提供了自我復制的功能,就是說新對象的創(chuàng)建可以通過已有對象進行創(chuàng)建。在 C++中拷貝構造函數(shù)(Copy Constructor)曾經(jīng)是很對程序員的噩夢,淺層拷貝和深層拷貝的魔魘也是很多程序員在面試時候的快餐和系統(tǒng)崩潰時候的根源之一。
結構圖:
原型模式提供了一個通過已存在對象進行新對象創(chuàng)建的接口(Clone),Clone()實現(xiàn)和具體的實現(xiàn)語言相關,在 C++中我們將通過拷貝構造函數(shù)實現(xiàn)之。
例子
注意事項:
(1)根據(jù)原型模式的UML圖可以知道,實現(xiàn)要依賴于抽象要不要依賴與具體
(2)拷貝構造函數(shù)是核心,而且針對c++要進行的是深拷貝
(3)克隆函數(shù)的關鍵就是調(diào)用拷貝構造函數(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; }
上一篇:舉例解析設計模式中的工廠方法模式在C++編程中的運用
欄 目:C語言
本文標題:解析設計模式中的Prototype原型模式及在C++中的使用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2463.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結構課程設計- 解析最少換車次數(shù)的問題詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入解析最長公共子串
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入解析Linux下\r\n的問題
- 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
- 01-10解析Linux下的時間函數(shù):設置以及獲取時間的方法


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery