设计模式学习[8]---原型模式

devtools/2024/11/23 9:30:29/

文章目录

  • 前言
    • 1.原理阐述
    • 2.举例
  • 总结

前言

这个设计模式第一次听到,以为有点类似于软件工程中的一个开发模式,原型化开发模式。

原型化开发是软件开发的一种常用方法。开发人员对用户提出的问题进行总结,就系统的主要需求取得一致意见后,开发出一个原型并运行之,然后反复对原型进行修改,使之逐步完善,直到用户对系统完全满意为止。

后来看了下资料,发现在设计模式里面,这个模式和软件开发的原型化开发还有有些不同的。

1.原理阐述

先用自己的话来说:
设计模式中的原型模式,是指创建的对象是基于一个原型。什么是基于一个原型?其实就是把原型对象的内容复制一份,粘贴到另一个新创建的对象上。

下面是官话:

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

白话和官话都说了一遍,总结一下就是:用一个原型对象来创建新的对象。
适用场景:创建给定类的对象过程很复杂,例如要设置许多成员变量的值时,适用这种设计模式就比较合适。

2.举例

我们投简历,目前都是写一份电子的简历,接着打印很多份纸质的简历,再投递到用人单位。
这里我们把纸质的简历看做一个对象 R e s u m e Resume Resume,那么每一张纸质的简历,其实就是一个 R e s u m e Resume Resume对象。
对于同一个人来说,他有很多份一样的简历,简历包括姓名,年龄,性别,学校,工作经历等等(这些就是成员变量)。
那么我们的每一份纸质简历对象Resume都有这么多的成员变量,如果要定义对象的话,就很繁琐。类似于下面这样

class Resume
{
public: Resume(std::string name,std::string sex,std::string experience){this->name=name;this->sex=sex;this->experience=experience;};
private:std::string name;std::string sex;std::string experience;.....//其他属性
};
int main()
{Resume *a=new Resume("澄澈i","男","没什么经验");Resume *b=new Resume("澄澈i","男","没什么经验");Resume *c=new Resume("澄澈i","男","没什么经验");return 0;
}

内容完全一样的简历,三张纸质简历需要创建三个对象,并且需要同样的变量初始化。一旦变量多了,就复杂了。
如果要改简历的内容,那么所有的纸质简历对象的内容都要改,非常麻烦。

那一开始我们提到了一个叫电子简历的东西,我们所有的纸质简历其实就是按照这个电子简历进行的打印。那么这个电子简历其实就可以称之为原型。原型模式中,原型一般都有一个函数叫克隆函数,clone(),专门用来给新建的对象的成员变量赋值。

下面是个简单的代码

class E_Resume
{
public:E_Resume(std::string name,std::string sex,std::string experience){this->name=name;this->sex=sex;this->experience=experience;};virtual ~E_Resume(){};virtual E_Resume* Clone()=0;
private:std::string name;std::string sex;std::string experience;
}
class Resume: public E_Resume
{
public: virtual E_Resume* Clone(){return new E_Resume*("澄澈i","男","没什么经验");};
};
int main()
{Resume* myResume=new E_Resume("澄澈i","男","没什么经验");Resume* cloneObj1=myResume->clone();return 0;
}

总结

原型模式和工厂模式一样,都是属于创建型模式。
前者更倾向于有大量相同的属性的对象创建,后者更适配于不同类型这种。
原型模式的关键是找到一个原型,定义克隆函数。
同时要注意是创建新对象的时候克隆,而非创建一个指针指向这个对象,这不是克隆对象,这是地址指向同一个对象,对象并没有增多。

简单工厂模式回顾


http://www.ppmy.cn/devtools/135958.html

相关文章

MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)

一、工具准备 对MongoDB进行导入导出、备份恢复等操作时需要用到命令工具,我们要先检查一下MongoDB安装目录下是否有这些工具,正常情况下是没有的:),因为新版本的MongoDB安装时不包含这些工具,需要我们手动下载安装。下载成功之后…

计算机毕设-基于springboot的多彩吉安红色旅游网站的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

【系统架构设计师】真题论文: 论企业应用系统的数据持久层架构设计(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2012年 试题2)解题思路论文素材参考数据持久层架构设计的目标与重要性常见的数据持久层架构模式企业应用系统数据持久层架构设计的考虑因素真题题目(2012年 试题2) 数据持久层(Data Persistence Laye…

组合设计模式

现实世界示例 每个组织都由员工组成。每个员工都有相同的特征,即拥有薪水、有职责、可能向某人汇报工作,也可能有下属等。 通俗解释 组合模式允许客户以统一的方式处理单个对象。 维基百科说明 在软件工程中,组合模式是一种分区设计模式。组…

Spring Boot核心概念:日志管理

日志记录是软件开发的重要组成部分,它帮助开发人员了解应用程序运行时的状态,以及在故障排查和性能监控时提供关键信息。Spring Boot通过提供默认的日志配置,简化了日志管理。 Spring Boot默认日志框架 Spring Boot默认使用Logback作为日志…

寻的制导律:从理论到应用的全景展示(下)

寻的制导律:从理论到应用的全景展示(下) 第六章 制导系统设计与实现 在制导系统的设计与实现过程中,系统需求分析、硬件与软件架构设计以及实现与测试方法是关键的三个环节。通过系统化的方法论,可以确保制导系统在复…

论文6—《基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用》文献阅读分析报告

论文报告:基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 摘要国内外研究现状1. 疏花技术研究2. 目标检测算法研究 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. Y…