1.原型模式
1.概述
用一个已经创建的实例为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。
用一个已经创建的实例为原型,来创建一个和原型对象相同的新对象。
2.结构
1.(Prototype)抽象原型类
抽象原型类是定义具有克隆自己的方法的接口,是所有具体原型类的公共父类。
2.ConcretePrototype(具体原型类)
具体原型类实现具体的克隆方法,在克隆方法中返回自己的一个克隆对象。
3.Client (客户类)
客户类让一个原型克隆自身,从而创建一个新的对象。在客户类中只需要直接实例化或通过工厂方法等创建一个对象,再通过调用该对象的克隆方法复制得到多个相同的对象。
原型模式分类:
原型模式克隆对象时,根据其成员对象是否也在克隆,原型模式可以分为两种形式,深克隆和浅克隆。
1.3 优缺点
优点:
(1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程。
(2)可以动态的减少或增加产品类。
缺点:
(1)需要为每一个类配备一个克隆方法,而且对这个克隆方法需要对类的功能进行通盘考虑。
(2)在实现克隆时,需要编写较为复杂的代码。
1.4 适用场景
(1)创建新对象成本较大(如初始化需要较长的时间),新对象可通过原型模式对已有对象进行复制来获得。
1.5 应用举例
原型模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在 C++中我们将通过拷贝构造函数实现之。
#include <iostream>
using namespace std;
/*抽象原型类*/
class Student
{
protected:
int id;
char name[10];
public:
virtual Student* Clone() = 0;
virtual void Show() = 0;
};
/*具体原型类*/
class StudentTypeA :public Student
{
public:
StudentTypeA(const char* name_input)
{
strcpy(name, name_input);
this->id = 0;
cout << "Construction....." << endl;
}
StudentTypeA(const StudentTypeA& other)
{
cout << "Copy Construction..." << endl;
this->id = other.id;
this->id++;
strcpy(this->name, other.name);
}
virtual StudentTypeA* Clone()
{
StudentTypeA* tmp = new StudentTypeA(*this);
return tmp;
}
void Show()
{
cout << "Student id == " << id << " name == " << name << endl;
}
~StudentTypeA()
{
cout << "Deconstruction StudentTypeA" << endl;
}
};
int main()
{
Student *student1 = new StudentTypeA("xiaoming");
Student *student2 = student1->Clone();
Student *student3 = student2->Clone();
student1->Show();
student2->Show();
student3->Show();
return 0;
}
总结:
其实这个设计模式比较简单,我们总结一下具体操作步骤。
1、声明一个抽象基类,并定义clone()函数为纯虚函数。
2、实例化各个子类,并且实现复制构造函数,并实现clone()函数
原型模式通过复制原型(原型)而获得新对象创建的功能,这里原型本身就是"对象工厂"(因为能够生产对象),实际上原型模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是: Builder 模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory 模式重在产生多个相互依赖类的对象,而原型模式重在从自身复制自己创建新类。