
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 class CPrototype
7 {
8 public:
9 CPrototype()
10 {
11
12 }
13 CPrototype(int iAge): m_iAge(iAge)
14 {
15
16 }
17 virtual CPrototype* Clone() = 0;
18
19 int m_iAge;
20 };
21
22 class CConcretePrototypeA: public CPrototype
23 {
24 public:
25 CConcretePrototypeA(int iAge, const string& strName):CPrototype(iAge), m_strName(strName)
26 {
27
28 }
29
30 // virtual CPrototype* Clone()
31 virtual CConcretePrototypeA* Clone()
32 {
33 return new CConcretePrototypeA(*this);
34 }
35
36 private:
37 CConcretePrototypeA(const CConcretePrototypeA& tmp)
38 {
39 this->m_iAge = tmp.m_iAge;
40 this->m_strName = tmp.m_strName;
41 }
42
43 public:
44 string m_strName;
45 };
46
47 int main(int argc, char* argv[])
48 {
49 // CPrototype* pstTypeA = new CConcretePrototypeA(30, "lisi");
50 // CPrototype* pstTypeB = pstTypeA->Clone();
51
52 CConcretePrototypeA* pstTypeA = new CConcretePrototypeA(30, "lisi");
53
54 CConcretePrototypeA* pstTypeB = pstTypeA->Clone();
55 pstTypeB->m_iAge = 40;
56 pstTypeB->m_strName = "zhangsan";
57
58 cout<< "pstTypeA.m_iAge: "<< pstTypeA->m_iAge<< "\tpstTypeA.m_strName "<< pstTypeA->m_strName<< endl;
59 cout<< "pstTypeB.m_iAge: "<< pstTypeB->m_iAge<< "\tpstTypeB.m_strName "<< pstTypeB->m_strName<< endl;
60
61 delete pstTypeA;
62 delete pstTypeB;
63
64 return 0;
65 }
66 ////////////////////////////////
67 [root@ ~/learn_code/design_pattern/7_proto_type]$ ./protoType
68 pstTypeA.m_iAge: 30 pstTypeA.m_strName lisi
69 pstTypeB.m_iAge: 40 pstTypeB.m_strName zhangsan