原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多对象,而复制出来的副本产生任何变化都不会影响到原型(注意:前提是clone的实现要满足深拷贝)。
要实现原型模式,关键就是要实现原型接口里面的
Clone
方法,通过Clone
方法来产生原型对象的副本,如下:
声明一个
IShape
接口,该接口核心的是Clone
方法。分别两个实现类Circle
与Square
,都实现了接口里面的方法,然后分别创建两个实现类对应的实例,并通过Clone
方法产生实例的副本,如下:
#include <iostream>
#include <string>
using namespace std;
// IShape 接口类
class IShape
{
public:
virtual string GetShapeName() = 0;
virtual void SetShapeName(string &) = 0;
virtual IShape* Clone() = 0;
};
// Square 类
class Square : public IShape
{
private:
string m_shapeName;
public:
Square(string &shapeName) : m_shapeName(shapeName){}
string GetShapeName()
{
return m_shapeName;
}
void SetShapeName(string &str)
{
m_shapeName = str;
}
IShape* Clone()
{
return new Square(this->m_shapeName);
}
};
// Circle 类
class Circle : public IShape
{
private:
string m_shapeName;
public:
Circle(string &shapeName) : m_shapeName(shapeName){}
string GetShapeName()
{
return m_shapeName;
}
void SetShapeName(string &str)
{
m_shapeName = str;
}
IShape* Clone()
{
return new Circle(this->m_shapeName);
}
};
int main()
{
string str1 = "Square";
string str2 = "Circle";
IShape *pShape1 = new Square(str1);
IShape *pShape2 = new Circle(str2);
IShape *pClone1 = pShape1->Clone();
IShape *pClone2 = pShape2->Clone();
cout << "pClone1 name : " << pClone1->GetShapeName() << endl;
cout << "pClone2 name : " << pClone2->GetShapeName() << endl;
return 0;
}
使用原型模式隐藏了对象创建的细节,不论对象多么的复杂,使用者调用
Clone
接口就可以创建一个原型对象的副本。同时无需初始化,可动态地获取当前原型的状态(即:如果修改了原型对象,在修改后调用Clone
方法,获取到的依然是原型对象的最新副本),并在当前基础上进行拷贝。