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

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

文章目录

  • 前言
    • 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.kler.cn/a/404068.html

相关文章:

  • async在js中是强制同步的意思吗
  • 七、电机三环控制
  • 《操作系统》实验内容 实验二 编程实现进程(线程)同步和互斥(Python 与 PyQt5 实现)
  • 【软考】系统架构设计师-信息系统基础
  • PostgreSQL常用字符串函数与示例说明
  • 哨兵节点链表
  • Elasticsearch面试内容整理-常见问题和解决方案
  • 微积分复习笔记 Calculus Volume 1 - 6.4 Arc Length of a Curve and Surface Area
  • nacos开启鉴权与配置加密
  • Python | 结合动态加载importlib模块来理解inspect模块的使用
  • Vue项目部署至服务器后报404错误的原因分析及解决方案
  • Dubbo HTTP接入架构
  • 丹摩征文活动 | SD3+ComfyUI:图文部署新境界,2合1效率提升,简化步骤对抗传统挑战!
  • UniApp在Vue3下使用setup语法糖创建和使用自定义组件
  • C++桥接模式在使用时需要注意什么
  • 算法定制LiteAIServer检测算法入侵检测算法平台部署:危险区域人员闯入治理
  • Python中Tushare(金融数据库)入门详解
  • 【pytorch-02】:张量的索引、形状操作和常见运算函数
  • 2024强网杯--babyheap house of apple2解法
  • Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
  • 细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的另一种方法
  • SAP Ariba Contracts 基本介绍
  • 知识见闻 - 数学: 均方根误差和标准差
  • 密码学之柯克霍夫原则(Kerckhoff原则)
  • 美创科技入选2024数字政府解决方案提供商TOP100!
  • jmeter常用配置元件介绍总结之监听器