一、原型模式
1、原理
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多对象,而复制出来的副本产生任何变化都不会影响到原型(注意:前提是clone的实现要满足深拷贝)。
2、UML类图
要实现原型模式,关键就是要实现原型接口里面的
Clone
方法,通过Clone
方法来产生原型对象的副本,如下:
3、示例
声明一个
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;
}
4、总结
使用原型模式隐藏了对象创建的细节,不论对象多么的复杂,使用者调用
Clone
接口就可以创建一个原型对象的副本。同时无需初始化,可动态地获取当前原型的状态(即:如果修改了原型对象,在修改后调用Clone
方法,获取到的依然是原型对象的最新副本),并在当前基础上进行拷贝。