Prototype
#include <iostream> #include <string.h> using namespace std; #define DESTORY_POINTER(ptr) if (ptr) { delete ptr; ptr = NULL; } #define STATUS int #define BUFSIZE 512 class Prototype { public: virtual ~Prototype() { DESTORY_POINTER(m_pMemory); } void AddStatus() { m_iStatus++; } void OutStatus() { cout<<"status:"<<m_iStatus<<endl; } void OutMemory() { cout<<"memory:"<<m_pMemory<<endl; } virtual Prototype* Clone()=0; protected: Prototype() : m_iStatus(0), m_pMemory(NULL) { m_pMemory = new char[BUFSIZE]; strcpy(m_pMemory, "Prototype");/*default*/ } STATUS m_iStatus; char* m_pMemory; }; class ConcretePrototypeA : public Prototype { public: ConcretePrototypeA() {} virtual ~ConcretePrototypeA() {} ConcretePrototypeA(const ConcretePrototypeA& other); Prototype* Clone(); }; class ConcretePrototypeB : public Prototype { public: ConcretePrototypeB() {} virtual ~ConcretePrototypeB() {} ConcretePrototypeB(const ConcretePrototypeB& other); Prototype* Clone(); }; ConcretePrototypeA::ConcretePrototypeA(const ConcretePrototypeA& other) { // value copy & deep copy m_iStatus = other.m_iStatus; m_pMemory = new char[BUFSIZE]; strcpy(m_pMemory, "ConcretePrototypeA"); } Prototype* ConcretePrototypeA::Clone() { return new ConcretePrototypeA(*this); } ConcretePrototypeB::ConcretePrototypeB(const ConcretePrototypeB& other) { // value copy & deep copy m_iStatus = other.m_iStatus; m_pMemory = new char[BUFSIZE]; strcpy(m_pMemory, "ConcretePrototypeB"); } Prototype* ConcretePrototypeB::Clone() { return new ConcretePrototypeB(*this); } int main(int argc, char *argv[]) { Prototype* pPrototypeA, *pPrototypeB = NULL; pPrototypeA = new ConcretePrototypeA; pPrototypeA->AddStatus(); pPrototypeB = pPrototypeA->Clone(); pPrototypeA->OutMemory(); pPrototypeB->OutMemory(); pPrototypeA->OutStatus(); pPrototypeB->OutStatus(); DESTORY_POINTER(pPrototypeA); DESTORY_POINTER(pPrototypeB); return 0; }