头文件
//PrototypePattern.h #ifndef PROTOTYPE_PATTERN_H #define PROTOTYPE_PATTERN_H #include <Windows.h> #include <string> using namespace std; namespace PrototypePattern { // Base Class ////////////////////////////////////////////////////////////////////////// class AbstractPrototype { public: AbstractPrototype(); virtual ~AbstractPrototype(); virtual AbstractPrototype* Clone() = 0; }; ////////////////////////////////////////////////////////////////////////// class ConcretePrototypeA : public AbstractPrototype { public: ConcretePrototypeA(string strName, int nId); ConcretePrototypeA(ConcretePrototypeA* pPrototypeA); virtual ~ConcretePrototypeA(); virtual AbstractPrototype* Clone(); private: string m_strName; int m_nID; }; ////////////////////////////////////////////////////////////////////////// class ConcretePrototypeB : public AbstractPrototype { public: ConcretePrototypeB(string strName, int nId); ConcretePrototypeB(ConcretePrototypeB* pPrototypeA); virtual ~ConcretePrototypeB(); virtual AbstractPrototype* Clone(); private: string m_strName; int m_nID; }; ////////////////////////////////////////////////////////////////////////// void PrototypePattern_Test_A(); void PrototypePattern_Test_B(); } #endif
实现
#include "PrototypePattern.h" #include <iostream> using namespace std; namespace PrototypePattern { ////////////////////////////////////////////////////////////////////////// AbstractPrototype::AbstractPrototype() { } AbstractPrototype::~AbstractPrototype() { } ////////////////////////////////////////////////////////////////////////// ConcretePrototypeA::ConcretePrototypeA(string strName, int nId) { m_strName = strName; m_nID = nId; } ConcretePrototypeA::ConcretePrototypeA(ConcretePrototypeA* pPrototypeA) { this->m_strName = pPrototypeA->m_strName; this->m_nID = pPrototypeA->m_nID; } ConcretePrototypeA::~ConcretePrototypeA() { } AbstractPrototype* ConcretePrototypeA::Clone() { cout << "ConcretePrototypeA::Clone\n"; cout << "m_strName=" << m_strName << "; m_nID =" << m_nID << ";\n"; return new ConcretePrototypeA(this); } ////////////////////////////////////////////////////////////////////////// ConcretePrototypeB::ConcretePrototypeB(string strName, int nId) { m_strName = strName; m_nID = nId; } ConcretePrototypeB::ConcretePrototypeB(ConcretePrototypeB* pPrototypeA) { this->m_strName = pPrototypeA->m_strName; this->m_nID = pPrototypeA->m_nID; } ConcretePrototypeB::~ConcretePrototypeB() { } AbstractPrototype* ConcretePrototypeB::Clone() { cout << "ConcretePrototypeB::Clone\n"; cout << "m_strName=" << m_strName << "; m_nID =" << m_nID << ";\n"; return new ConcretePrototypeB(this); } ////////////////////////////////////////////////////////////////////////// void PrototypePattern_Test_A() { AbstractPrototype* pPrototype1 = new ConcretePrototypeA("ConcretePrototypeA", 1); AbstractPrototype* pPrototype2 = pPrototype1->Clone(); AbstractPrototype* pPrototype3 = pPrototype2->Clone(); delete pPrototype3; pPrototype3 = NULL; delete pPrototype2; pPrototype2 = NULL; delete pPrototype1; pPrototype1 = NULL; } void PrototypePattern_Test_B() { AbstractPrototype* pPrototype1 = new ConcretePrototypeA("ConcretePrototypeB", 2); AbstractPrototype* pPrototype2 = pPrototype1->Clone(); AbstractPrototype* pPrototype3 = pPrototype2->Clone(); delete pPrototype3; pPrototype3 = NULL; delete pPrototype2; pPrototype2 = NULL; delete pPrototype1; pPrototype1 = NULL; } }
客户端
#include "PrototypePattern.h" #include <iostream> using namespace std; using namespace PrototypePattern; void main() { PrototypePattern_Test_A(); PrototypePattern_Test_B(); }
运行结果
结构类图
用例模型
设计类图
顺序图