1. 程式人生 > 實用技巧 >006 --- 第9章 原型模式

006 --- 第9章 原型模式

簡述:

  原型模式用原型例項指定建立物件的種類,並且通過考北這些原型建立新的物件。

  原型模式包括:抽象原型類、具體原型類。

    抽象原型類:宣告一個克隆自身的接扣。

    具體原型類:繼承自抽象原型類,實現一個克隆自身的操作。

原型模式程式碼:

 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 class
CConcretePrototype : 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 }

輸出結果: