当前位置: 首页 > news >正文

创建型模式 | 原型模式

一、原型模式

1、原理

原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多对象,而复制出来的副本产生任何变化都不会影响到原型(注意:前提是clone的实现要满足深拷贝)。

2、UML类图

要实现原型模式,关键就是要实现原型接口里面的Clone方法,通过Clone方法来产生原型对象的副本,如下:

在这里插入图片描述

3、示例

声明一个IShape接口,该接口核心的是Clone方法。分别两个实现类CircleSquare,都实现了接口里面的方法,然后分别创建两个实现类对应的实例,并通过Clone方法产生实例的副本,如下:

#include <iostream>
#include <string>
using namespace std;// IShape 接口类
class IShape
{
public:virtual string GetShapeName() = 0;virtual void SetShapeName(string &) = 0;virtual IShape* Clone() = 0;
};// Square 类
class Square : public IShape
{
private:string m_shapeName;public:Square(string &shapeName) : m_shapeName(shapeName){}string GetShapeName(){return m_shapeName;}void SetShapeName(string &str){m_shapeName = str;}IShape* Clone(){return new Square(this->m_shapeName);}
};// Circle 类
class Circle : public IShape
{
private:string m_shapeName;public:Circle(string &shapeName) : m_shapeName(shapeName){}string GetShapeName(){return m_shapeName;}void SetShapeName(string &str){m_shapeName = str;}IShape* Clone(){return new Circle(this->m_shapeName);}
};int main()
{string str1 = "Square";string str2 = "Circle";IShape *pShape1 = new Square(str1);IShape *pShape2 = new Circle(str2);IShape *pClone1 = pShape1->Clone();IShape *pClone2 = pShape2->Clone();cout << "pClone1 name : " << pClone1->GetShapeName() << endl;cout << "pClone2 name : " << pClone2->GetShapeName() << endl;return 0;
}

4、总结

使用原型模式隐藏了对象创建的细节,不论对象多么的复杂,使用者调用Clone接口就可以创建一个原型对象的副本。同时无需初始化,可动态地获取当前原型的状态(即:如果修改了原型对象,在修改后调用Clone方法,获取到的依然是原型对象的最新副本),并在当前基础上进行拷贝。

相关文章:

  • 【赠书活动】OpenCV4工业缺陷检测的六种方法
  • 50ms时延工业相机
  • 网络层协议
  • Springboot数据校验与异常篇
  • HTML输出特殊字符详细方法
  • 快猫视频模板源码定制开发 苹果CMS 可打包成双端APP
  • 基于“Galera+MariaDB”搭建多主数据库集群的实例
  • windows11下载GCC编译器
  • 使用docker-compose搭建docker私服与配置WebUI
  • 关于“Python”的核心知识点整理大全31
  • 深度学习第一课 TensorFlow2.0开发首选API - Keras
  • spring boot回顾02
  • 【K8s】2# 使用kuboard管理K8s集群(kuboard安装)
  • MFC 消息映射机制
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)
  • Docker 笔记(2):Dockerfile
  • echarts的各种常用效果展示
  • JavaScript实现分页效果
  • JSONP原理
  • Linux后台研发超实用命令总结
  • spring boot 整合mybatis 无法输出sql的问题
  • vue.js框架原理浅析
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue脚手架vue-cli
  • 基于 Babel 的 npm 包最小化设置
  • 聊聊redis的数据结构的应用
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深入浏览器事件循环的本质
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 王永庆:技术创新改变教育未来
  • 我是如何设计 Upload 上传组件的
  • 鱼骨图 - 如何绘制?
  • 主流的CSS水平和垂直居中技术大全
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 《码出高效》学习笔记与书中错误记录
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #define
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $jQuery 重写Alert样式方法
  • $NOIp2018$劝退记
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (BFS)hdoj2377-Bus Pass
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (九)c52学习之旅-定时器
  • (七)Knockout 创建自定义绑定
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .Net Remoting常用部署结构
  • .NET构架之我见
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Angular] 笔记 21:@ViewChild
  • [Asp.net mvc]国际化
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)