006 --- 第9章 原型模式
阿新 • • 發佈:2020-08-11
簡述:
原型模式用原型例項指定建立物件的種類,並且通過考北這些原型建立新的物件。
原型模式包括:抽象原型類、具體原型類。
抽象原型類:宣告一個克隆自身的接扣。
具體原型類:繼承自抽象原型類,實現一個克隆自身的操作。
原型模式程式碼:
1 #include <iostream> 2 using namespace std; 3 4 // 原型模式 5 // 抽象原型類 6 class CPrototype 7 { 8 private: 9 string m_szID; 10 11 public: 12 CPrototype() {}13 14 CPrototype(string szID) 15 { 16 m_szID = szID; 17 } 18 19 void SetID(string szID) 20 { 21 m_szID = szID; 22 } 23 24 string GetID() 25 { 26 return m_szID; 27 } 28 29 virtual CPrototype& Clone() = 0; 30 }; 31 32 // 具體原型類 33 classCConcretePrototype : public CPrototype 34 { 35 public: 36 CConcretePrototype() {} 37 38 CConcretePrototype(string szID) : CPrototype(szID) {} 39 40 virtual CPrototype& Clone() 41 { 42 return (CPrototype&)*this; 43 } 44 }; 45 46 int main() 47 { 48 CConcretePrototype ConcretePrototype1("GHL"); 49 CConcretePrototype ConcretePrototype2 = (CConcretePrototype&)ConcretePrototype1.Clone(); 50 ConcretePrototype2.SetID("GGG"); 51 cout << ConcretePrototype1.GetID() << endl; 52 cout << ConcretePrototype2.GetID() << endl; 53 54 system("pause"); 55 return 0; 56 }
輸出結果:
例:簡歷的克隆
注:本例在clone()函式中需要用到深拷貝
1 // 工作經歷 2 class CWorkExperience 3 { 4 private: 5 string m_szWorkDate; 6 string m_szCompany; 7 8 public: 9 void SetWorkDate(string szWorkDate) 10 { 11 m_szWorkDate = szWorkDate; 12 } 13 string GetWorkDate() 14 { 15 return m_szWorkDate; 16 } 17 18 void SetCompany(string szCompany) 19 { 20 m_szCompany = szCompany; 21 } 22 string GetCompany() 23 { 24 return m_szCompany; 25 } 26 27 CWorkExperience* Clone() 28 { 29 CWorkExperience* pWorkExperience = new CWorkExperience(); 30 pWorkExperience->SetWorkDate(GetWorkDate()); 31 pWorkExperience->SetCompany(GetCompany()); 32 return pWorkExperience; 33 } 34 }; 35 36 // 簡歷(具體原型類) 37 class CResume 38 { 39 private: 40 string m_szName; 41 string m_szSex; 42 string m_szAge; 43 CWorkExperience* m_pWorkExperience; 44 45 CResume(CWorkExperience* pWorkExperience) : m_pWorkExperience(NULL) 46 { 47 m_pWorkExperience = pWorkExperience->Clone(); 48 } 49 50 public: 51 CResume() : m_pWorkExperience(NULL) {} 52 53 CResume(string szName) : m_pWorkExperience(NULL) 54 { 55 m_szName = szName; 56 m_pWorkExperience = new CWorkExperience(); 57 } 58 59 ~CResume() 60 { 61 if (m_pWorkExperience) 62 { 63 delete m_pWorkExperience; 64 m_pWorkExperience = NULL; 65 } 66 } 67 68 void SetPersionalInfo(string szSex, string szAge) 69 { 70 m_szSex = szSex; 71 m_szAge = szAge; 72 } 73 74 void SetWorkExperience(string szWorkDate, string szCompany) 75 { 76 m_pWorkExperience->SetWorkDate(szWorkDate); 77 m_pWorkExperience->SetCompany(szCompany); 78 } 79 80 void Display() 81 { 82 cout << m_szName << " " << m_szSex << " " << m_szAge << endl; 83 cout << "工作經歷: " << m_pWorkExperience->GetWorkDate() << " " 84 << m_pWorkExperience->GetCompany() << endl << endl; 85 } 86 87 CResume* Clone() 88 { 89 CResume* pResume = new CResume(m_pWorkExperience->Clone()); 90 pResume->m_szName = m_szName; 91 pResume->m_szSex = m_szSex; 92 pResume->m_szAge = m_szAge; 93 return pResume; 94 } 95 }; 96 97 int main() 98 { 99 CResume* pResume1 = new CResume("GHL"); 100 pResume1->SetPersionalInfo("男", "29"); 101 pResume1->SetWorkExperience("2018-2020", "MMM"); 102 103 CResume* pResume2 = pResume1->Clone(); 104 pResume2->SetWorkExperience("2016-2018", "BBB"); 105 106 pResume1->Display(); 107 pResume2->Display(); 108 109 if (pResume1) 110 { 111 delete pResume1; 112 pResume1 = NULL; 113 } 114 if (pResume2) 115 { 116 delete pResume2; 117 pResume2 = NULL; 118 } 119 120 system("pause"); 121 return 0; 122 }
輸出結果: