23种设计模式之(五)原型模式(python_c++实现)

23种设计模式之(五)原型模式(Prototype)

本文主要介绍23种设计模式之原型模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接


原型模式(Prototype)

概念

原型模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例,原型模式创建的实例,具有与原型一样的数据:

(1)由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。

(2)目标对象是原型对象的一个克隆。也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。

(3)根据对象拷贝层次的不同,有浅拷贝与深拷贝。

GoF对原型模式的定义是:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

应用场景

用new创建一个对象需要非常繁琐的数据准备或者权限,对象创造过程复杂,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

代码示例

C++代码示例

/************************************************************************/
/* 设计模式专题
/*
/* 原型模式
/*
/* Author  : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date    : 20180915
/************************************************************************/ 
#include 
class PrototypePerson
{
public:
    virtual PrototypePerson* clone() = 0;
    virtual PrototypePerson* deep_clone() = 0;
    virtual void show() = 0;
};

class  CopyPerson : public PrototypePerson
{
public:
    CopyPerson()
    {
        m_name = "";
        m_age = 0;
        m_resume = NULL;
    }
    CopyPerson(std::string name, int age,char * p)
    {
        m_name = name;
        m_age = age;
        m_resume = new char[strlen(p) + 1];
        memset(m_resume,0,strlen(p) + 1);
        strcpy(m_resume, p);

    }
    void setResume(char *p)
    {
        if (m_resume != NULL)
        {
            delete m_resume;
        }
        m_resume = new char[strlen(p) + 1];
        memset(m_resume,0,strlen(p) + 1);
        strcpy(m_resume, p);
    }


    virtual void show()
    {
        printf("m_name:%s  ",m_name.c_str());
        printf("m_age:%d  ",m_age);
        printf("m_resume:%s\n",m_resume);

    }
    virtual CopyPerson* clone()
    {
        CopyPerson *tmp = new CopyPerson;
        *tmp = *this; // 浅拷贝
        return tmp;
    }
    virtual CopyPerson* deep_clone()
    {
        CopyPerson *tmp = new CopyPerson;
        tmp->m_name = this->m_name;
        tmp->m_age = this->m_age;
        //深拷贝
        tmp->m_resume = new char[strlen(this->m_resume) + 1];
        memset(tmp->m_resume,0,strlen(this->m_resume) + 1);
        strcpy(tmp->m_resume, this->m_resume);
        return tmp;
    }
protected:
private:
    std::string m_name;
    int     m_age ;
    char    *m_resume;

};

void main()
{   

    CopyPerson * srcPerson = new CopyPerson("张三", 32,"src_resume");
    printf("show  src obj           : ");
    srcPerson->show();

    CopyPerson *dstPerson1 = srcPerson->clone();
    printf("show  shallow copy obj  : ");
    dstPerson1->show();

    CopyPerson *dstPerson2 = srcPerson->deep_clone();
    printf("show  deep copy  obj    : ");
    dstPerson2->show();

    srcPerson->setResume("dst_resume");
    printf("------show  obj afer change------\n");
    printf("show  src obj           : ");
    srcPerson->show();
    printf("show  shallow copy obj  : ");
    dstPerson1->show();
    printf("show  deep copy obj     : ");
    dstPerson2->show();

}

python代码示例

# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 原型模式
#
# Author  : zzl
#
# 编程环境: window10 python2.7
#
# Date    : 20180915
##################################################################
import copy


class PrototypePerson(object):
    def clone(self):
        pass

    def deep_clone(self):
        pass

    def show(self):
        pass


# resume类
class ResumeObj(object):

    def __init__(self, resume):
        self.resume = resume

    def __str__(self):
        return self.resume


class CopyPerson(PrototypePerson):
    def __init__(self):
        self.name = ""
        self.age = 0
        self.resume = ResumeObj()

    def __init__(self, name, age, resume):
        self.m_name = name
        self.m_age = age
        self.m_resume = resume

    def show(self):
        print("m_name:%s m_age:%s m_resume:%s" % (self.m_name, self.m_age, self.m_resume))

    def clone(self):
        return copy.copy(self)

    def deep_clone(self):
        return copy.deepcopy(self)


if __name__ == "__main__":
    srcPerson = CopyPerson(u"张三", 32, ResumeObj("src_resume"))
    print("show  src obj ")
    srcPerson.show()

    dstPerson1 = srcPerson.clone()
    print("show  shallow copy obj: ")
    dstPerson1.show()

    dstPerson2 = srcPerson.deep_clone()
    print("show  deep copy  obj : ")
    dstPerson2.show()

    #change src obj
    srcPerson.m_resume.resume = "change"
    print("------show  obj afer change------")
    print("show  src obj: ")
    srcPerson.show()
    print("show  shallow copy obj: ")
    dstPerson1.show()
    print("show  deep copy obj: ")
    dstPerson2.show()

源码链接

设计模式(五)原型模式示例代码(python–c++)

你可能感兴趣的:(设计模式,设计模式,python,c++)