原型模式

Prototype(原型)模式是一种对象创建型模式,它采取复制原型对象的方法来创建新的对象实例。使用Prototype模式创建的实例,具有与原型一样的数据。  
1. 由原型对象(旧对象)自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2. 目标对象是原型对象的一个克隆。
3. 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
角色及职责
这里写图片描述
原型模式主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的自我复制接口,通过该接口可以对原型对象进行拷贝/克隆。
  有一个原型抽象类,里面提供了clone的纯虚函数,他的子类–具体的原型类,也就是要进行自我复制的类,实现这个clone接口,客户端可以通过抽象类来实现原型对象的自我复制。
  在子类里面要注意构造函数,析构函数,深浅拷贝的问题!
适用情况:
一个复杂对象,具有自我复制功能,统一一套接口。
案例

#include <iostream>
using namespace std;


#ifdef __cplusplus
extern "C"
{
#endif

#include <string.h>
extern size_t __cdecl strlen(const char *_Str);
extern char * __cdecl strcpy(char * __restrict__ _Dest,const char * __restrict__ _Source);


#ifdef __cplusplus
}
#endif



class Person
{
public:
    virtual Person * clone()= 0 ;
    virtual void PrintPerson()=0;
    virtual void free_m() = 0;
    virtual void get_m() = 0;
};

class CPPer : public Person
{
public:
    CPPer(string name,int age)
    {
        m_name = name;
        m_age = age;
        setResume("NULL");
    }

    CPPer()
    {
        m_name = "";
        m_age = 0;
        m_resume = NULL;
    }

    /*实现深拷贝*/
    void setResume(char * p)
    {
        if(m_resume != NULL)
            delete m_resume;

        m_resume = new char[strlen(p)+1];
        strcpy(m_resume,p);
    }

    virtual Person * clone()
    {
        CPPer * new_person = new CPPer;

        //*new_person = *this;//-->默认的等号操作符--浅拷贝


        new_person->m_name = this->m_name;
        new_person->m_age = this->m_age;

        //new_person->m_resume = this->m_resume;//--浅拷贝

         /*遇到指针要注意进行深拷贝*/
        new_person->setResume("this->m_resume");

        return new_person;
    }

    virtual void PrintPerson()
    {
        cout<<"m_name:\t"<<m_name<<"m_age:\t"<<m_age<<"m_resume:\t"<<m_resume<<endl;
    }

    virtual void free_m()
    {
        delete m_resume;
        m_resume = NULL;
    }
    virtual void get_m()
    {
        cout<<"m_resume:"<<m_resume<<endl;
    }

private:
    string m_name;
    int m_age;
    char *m_resume;
};


int main263()
{

    Person * p1 = new CPPer("Simon",22);
    p1->PrintPerson();
    //delete p1;

    Person * p2 = p1->clone();
    p2->PrintPerson();

    p1->get_m();
    p2->get_m();

    p1->free_m();

    p2->get_m();
    p2->free_m();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值