前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之原型模式(Prototype 模式)

设计模式之原型模式(Prototype 模式)

作者头像
海盗船长
发布2021-12-07 16:06:29
3520
发布2021-12-07 16:06:29
举报
文章被收录于专栏:基础知识文章基础知识文章

概念

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

介绍

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 主要解决:在运行期建立和删除原型。 何时使用

  1. 当一个系统应该独立于它的产品创建,构成和表示时。
  2. 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  3. 为了避免创建一个与产品类层次平行的工厂类层次时。
  4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。 优点: 1、性能提高。 2、逃避构造函数的约束。 缺点: 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

代码实现

“Prototype.h”
代码语言:javascript
复制
#ifndef _PROTOTYPE_H
#define _PROTOTYPE_H
class Prototype{
public:
	virtual ~Prototype();
	virtual Prototype* Clone() const =0;
protected:
	Prototype();
};
class ConcretePrototype:public Prototype{
public:
	ConcretePrototype();
	~ConcretePrototype();
	ConcretePrototype(const ConcretePrototype& cp);
	Prototype* Clone()const;
};
#endif
“Prototype.cpp”
代码语言:javascript
复制
#include"Prototype.h"
#include<iostream>
using namespace std;

Prototype::Prototype(){}
Prototype::~Prototype(){}
Prototype* Prototype::Clone()const{
	return 0;
}

ConcretePrototype::ConcretePrototype(){}
ConcretePrototype::~ConcretePrototype(){}
ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp){
	cout << "ConcretePrototype copy" << endl;
}
Prototype* ConcretePrototype::Clone()const{
	return new ConcretePrototype(*this);
}
“test.cpp”
代码语言:javascript
复制
#include"Prototype.h"
#include<iostream>
using namespace std;
int main(){
	Prototype* p = new ConcretePrototype;
	Prototype* p1= p->Clone();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述

Prototype 模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方 式, 这也是 C++实现技术层面上的事情。 由于在示例代码中不涉及到深层拷贝(主要指有指针、复合对象的情况),因此我们通过编译器提供的默认的拷贝构造函数(按位拷贝)的方式进行实现。

总结

Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂”(因为能够生产对象), 实际上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例) 来专门负责对象的创建工作(工厂对象),它们之间的区别是: Builder 模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory 模式重在产生多个相互依赖类的对象,而 Prototype 模式重在从自身复制自己创建新类

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 介绍
  • 代码实现
  • 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档