设计模式C++实现(5)——原型模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(5)——原型模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??DP書上的定義為:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。其中有一個詞很重要,那就是拷貝??梢哉f,拷貝是原型模式的精髓所在。舉個現實中的例子來介紹原型模式。找工作的時候,我們需要準備簡歷。假設沒有打印設備,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷,如果要修改簡歷中的某項,那么所有已寫好的簡歷都要修改,工作量很大。隨著科技的進步,出現了打印設備。我們只需手寫一份,然后利用打印設備復印多份即可。如果要修改簡歷中的某項,那么修改原始的版本就可以了,然后再復印。原始的那份手寫稿相當于是一個原型,有了它,就可以通過復印(拷貝)創造出更多的新簡歷。這就是原型模式的基本思想。下面給出原型模式的UML圖,以剛才那個例子為實例。
?
?? ? 原型模式實現的關鍵就是實現Clone函數,對于C++來說,其實就是拷貝構造函數,需實現深拷貝,下面給出一種實現。
/** @Author: Zhibo Wang* @Date: 2021-04-18 22:09:24* @LastEditTime: 2021-04-18 22:09:28*/#include <bits/stdc++.h> using namespace std;class Resume { protected:char *name;public:Resume();virtual ~Resume();virtual Resume *clone() = 0;virtual void Show() = 0;virtual void Set(char *n); };class ResumeA : public Resume { public:ResumeA(char *m_name);~ResumeA();ResumeA(const ResumeA &m_name);ResumeA *clone();void Show(); }; ResumeA::ResumeA(char *m__name) {if (m__name == nullptr){name = new char[1];name[0] = '\0';}name = new char[strlen(m__name)];strcpy(name, m__name); } ResumeA::ResumeA(const ResumeA &m_name) {name = new char[strlen(m_name.name) + 1];strcpy(name, m_name.name); } ResumeA::~ResumeA() {if (name){delete[] name;name = NULL;} } ResumeA *ResumeA::clone() {return new ResumeA(*this); } void ResumeA::Show() {cout << "RESUMEA Clone" << endl; }int main() {Resume *r1 = new ResumeA("A");// Resume *r2 = new ResumeB("B");Resume *r3 = r1->clone();// Resume *r4 = r2->Clone();// r1->Show(); r2->Show();//刪除r1,r2delete r1;// delete r2;r1 = NULL;//深拷貝所以對r3,r4無影響r3->Show();// \r4->Show();delete r3;// delete r4;r3 = NULL; }?
總結
以上是生活随笔為你收集整理的设计模式C++实现(5)——原型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式C++实现(4)——桥接模式
- 下一篇: 设计模式C++实现(7)——观察者模式