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