原型模式
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
它属于创建者模式,其实就是通过一个对象再创建另外一个对象的副本,但是不需要知道任何创建对象所需要的细节。
优点:
1、当一个对象经过一段时间后,它内部的状态已经发生了变化,这时候,程序的其他业务需要当前状态下 的对象去进行其他的操作。这时候如果直接在new一个新的对象出来,它的状态就对应不上了。这时候采用原型模式,就可以获取一个状态一致的对象。
2、有时候创建对象时,构造函数需要的参数却很多,但是我们又不完全的知道每个参数的具体含义,就可以使用原型模式来创建一个新的对象,从而不必去理会创建的过程。
3、恰当的使用原型模式,可以减少代码量,提高程序的效率。
代码:
#include <iostream>
using namespace std;
//原型
class Prototype
{
public:
Prototype(int n) :m_num(0)
{
m_num = n;
}
int getNum()
{
return m_num;
}
virtual Prototype* clone() = 0;
private:
int m_num;
};
//具体原型实例A
class PrototypeA :public Prototype
{
public:
PrototypeA(int num) :Prototype(num)
{
}
Prototype* clone()
{
return new PrototypeA(*this);
}
};
//具体原型实例B
class PrototypeB :public Prototype
{
public:
PrototypeB(int num) :Prototype(num)
{
}
Prototype* clone()
{
return new PrototypeB(*this);
}
};
//客户端
int main()
{
PrototypeA *proA = new PrototypeA(10);
cout << "proA-num=" << proA->getNum() << " 对象&=" << proA << endl;
PrototypeA *newproA = static_cast<PrototypeA*>(proA->clone());
cout << "newproA-num=" << newproA->getNum() <<" 对象&="<< newproA << endl;
PrototypeB *newproB = static_cast<PrototypeB*>(proA->clone());
cout << "newproB-num=" << newproB->getNum() << " 对象&=" << newproB << endl;
if (proA)
{
delete proA;
proA = nullptr;
}
if (newproA)
{
delete newproA;
newproA = nullptr;
}
if (newproB)
{
delete newproB;
newproB = nullptr;
}
return 0;
}