[创建型模式] 原型模式的理解





头文件
//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();
}

运行结果








结构类图


用例模型




设计类图


顺序图

猜你喜欢

转载自jacky-dai.iteye.com/blog/2297214