23种设计模式之(五)原型模式(Prototype)
本文主要介绍23种设计模式之原型模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
原型模式(Prototype)
概念
原型模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例,原型模式创建的实例,具有与原型一样的数据:
(1)由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
(2)目标对象是原型对象的一个克隆。也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
(3)根据对象拷贝层次的不同,有浅拷贝与深拷贝。
GoF对原型模式的定义是:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
应用场景
用new创建一个对象需要非常繁琐的数据准备或者权限,对象创造过程复杂,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
代码示例
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 原型模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180915
/************************************************************************/
#include <iostream>
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()