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;
}

 

posted @ 2014-12-09 13:49  stanley19861028  阅读(147)  评论(0编辑  收藏  举报