博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(4) - Prototype原型模式
阅读量:4071 次
发布时间:2019-05-25

本文共 1557 字,大约阅读时间需要 5 分钟。

目录


1. 模式简介

   原型模式可以让我们在创建新的实例时,隐藏内部复杂性。

   比如有时候我们在创建一个对象时,非常耗资源,可能要搜索数据库获取一些资料,或者是加载一个内存占用达几个G的重量级分词组件到内存中,亦或是构建一个需要很多算力资源的实例。如果是类似这些场景,那prototype模式是一个很好的选择。
   主要思想其实比较简单:先用原型实例指定创建对象的种类,再通过拷贝这些原型,来创建新的对象。
   Prototype模式提供了一个通过已存在对象进行新对象创建的接口(即Clone函数), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。

2. UML类图

按照GOF,各个角色的说明:

Prototype(抽象原型类)
声明一个克隆自身的接口。此角色负责定义用于复制现有实例来生成新实例的方法,即Clone()。
ConcretePrototype(具体原型类)
实现一个克隆自身的操作。此角色负责实现复制现有实例并生成新实例的方法。
Client(客户类/使用者)
让一个原型克隆自身从而创建一个新的对象。此角色负责使用复制实例的方法生成新的实例。

3. 代码实现

#include 
using namespace std;//抽象原型类class Prototype {public: virtual Prototype* Clone() = 0; virtual void Execute() = 0;};//原型实现类class ConcretePrototype : public Prototype {public: ConcretePrototype() {} //拷贝构造 ConcretePrototype(const ConcretePrototype& rhs) { cout << "copy construct() call" << endl; } virtual ~ConcretePrototype() {}public: Prototype* Clone() override { return new ConcretePrototype(*this); } void Execute() override { cout << "execute() done" << endl; }};//客户类class Client {public: Client() { _pt = new ConcretePrototype; } virtual ~Client() {} void Operation() { Prototype* pt = _pt->Clone(); pt->Execute(); }private: Prototype* _pt;};int main(int argc, char* argv[]){ Client cli; cli.Operation(); return 0;}

运行结果为:

  copy construct() call
  execute() done

4. 总结

   Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。

转载地址:http://cleji.baihongyu.com/

你可能感兴趣的文章
医疗行业运用企业云盘可以带来什么样的提升
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret&nbsp;1.1&nbsp;正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>