原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。
使用场景
当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
优缺点
优点:
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
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓