作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。
使用场景
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
- 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
- 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
优缺点
-
优点:
1、性能提高。
2、逃避构造函数的约束。 -
缺点:
1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
2、必须实现 clone接口。
注意事项
原型模式实现的是一个clone接口,注意是接口,也就是基于多态的clone虚函数。也就是说原型模式能够通过基类指针来复制派生类对象。拷贝构造函数完不成这样的任务。
UML结构图
代码实现
interface.h
创建抽象类 - 图形,提供克隆接口; 创建具体类 - 圆形,完成克隆自己
#include <string>
#include <iostream>
using namespace std;
class Shape //基类-图形
{
public:
Shape() { cout << "create Shape" << endl; }
virtual ~Shape() {}
virtual Shape * clone() = 0;
virtual void test() = 0;
};
class Circle: public Shape //子类-圆形
{
public:
Circle(string type): type(type) { cout << "create Circle" << endl; }
~Circle() {}
Circle(const Circle& circle) { this->type = circle.type; } //拷贝构造函数
Shape * clone() { return new Circle(*this); } //克隆
void test() { cout << "type: " << type << endl; }
private:
string type;
};
main.cpp
实例应用 - 先创建circle1,再使用circle1 克隆出circle2
根据运行结果可以看到,circle2是克隆出来的没有调用构造函数
#include "interface.h"
int main()
{
Shape *circle1 = new Circle("circle");
circle1->test();
cout << endl;
Shape *circle2 = circle1->clone();
circle2->test();
cout << endl;
if (circle1 == circle2)
{
cout << "same" << endl;
}
else
{
cout << "different" << endl;
}
return 0;
}
运行结果:
create Shape
create Circle
type: circle
create Shape
type: circle
different