prototype模式即原型模式,同样先上uml图:
uml解析:原型模式讲的是什么呢?原型模式讲的其实就是浅拷贝跟深拷贝的问题。什么是浅拷贝什么是深拷贝呢,相信学过c++的都懂。凡涉及到一个类中的成员变量有指针的,一定会设计到深浅拷贝问题。浅拷贝只是简单的复制指针的值,而没有复制指针的内容,这样在使用以及析构的时候往往会出现问题。一般是要实现拷贝构造函数,重载“=”操作符以及析构等。
下面给出可执行的代码:
Prototype.h
#pragma once
#include <iostream>
using namespace std;
class Prototype
{
public:
Prototype(void);
virtual ~Prototype(void);
};
class ConcrectPrototype:public Prototype
{
public:
ConcrectPrototype();
ConcrectPrototype(int &p,int &q);
ConcrectPrototype(const ConcrectPrototype &p);
ConcrectPrototype & operator = (const ConcrectPrototype &p);
~ConcrectPrototype();
void showP();
private:
int * m_p;
int m_q;
};
Prototype.cpp
#include "Prototype.h"
Prototype::Prototype(void)
{
}
Prototype::~Prototype(void)
{
}
ConcrectPrototype::ConcrectPrototype()
{
}
ConcrectPrototype::ConcrectPrototype(int &m_p,int &m_q)
{
this->m_p = new int(m_p);
this->m_q = m_q;
}
ConcrectPrototype::ConcrectPrototype(const ConcrectPrototype& p)
{
m_q = p.m_q;
m_p = new int(*p.m_p);
}
ConcrectPrototype & ConcrectPrototype::operator = (const ConcrectPrototype & p)
{
m_q = p.m_q;
m_p = new int(*p.m_p);
return *this;
}
ConcrectPrototype::~ConcrectPrototype()
{
if(m_p!=NULL)
delete m_p;
}
void ConcrectPrototype::showP()
{
cout<<m_p<<":"<<*m_p<<endl;
}
main.cpp
#include "Prototype.h"
int main(int argc,char ** argv)
{
int p=3,q=1;
ConcrectPrototype p1(p,q);
ConcrectPrototype p2;
p2=p1;
//output p1、p2
p1.showP();
p2.showP();
return 0;
}
执行之后的结果:
可以看到输出的地址是不一样的,因为是深拷贝。这就是原型模式。