找了一图:这就很好理解了
什么是原型模式?
在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。
为什么要使用原型模式?
原型模式和建造者模式、工厂方法模式一样,都属于创建型模式的一种。简单的来说,我们使用原型模式,就是为了创建对象。
下面的场景中使用原型模式最好:
1. 当我们的对象类型不是开始就能确定的,而这个类型是在运行期确定的话,那么我们通过这个类型的对象克隆出一个新的对象比较容易一些;
2. 有的时候,我们需要一个对象在某个状态下的副本,此时,我们使用原型模式是最好的选择
3. 当我们处理一些比较简单的对象时,并且对象之间的区别很小,可能就几个属性不同而已,那么就可以使用原型模式来完成,省去了创建对象时的麻烦了
4.有的时候,创建对象时,构造函数的参数很多,而自己又不完全的知道每个参数的意义,就可以使用原型模式来创建一个新的对象,不必去理会创建的过程,让创建过程见鬼去吧。
用UML类图表示原型模式
C++实现
class Prototype
{
public:
Prototype(){}
virtual ~Prototype(){}
virtual Prototype *Clone() = 0;
};
class ConcretePrototype : public Prototype
{
public :
ConcretePrototype()
:m_count(0)
{}
virtual ~ConcretePrototype()
{}
//拷贝构造
ConcretePrototype(const ConcretePrototype &cp)
{
m_count = cp.m_count;
}
//赋值自身
virtual ConcretePrototype * Clone()
{
//调用拷贝构造函数
return new ConcretePrototype(*this);
}
private:
int m_count;
};
测试:
int test_Prototype()
{
//生成对象
ConcretePrototype *pa = new ConcretePrototype();
//复制自身
ConcretePrototype* pb = pa->Clone();
delete pa;
delete pb;
pa = NULL;
pb = NULL;
system("pause");
return 0;
}
其实,在我看来 这就是我们在自己实现string类时遇到的深浅拷贝的事,只是这里用了Clone()函数,我们就直接写出深拷贝的拷贝构造函数。