news 2026/5/8 17:43:39

创建型设计模式——原型模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
创建型设计模式——原型模式

文章目录

    • 原型模式
      • 结构
      • 实现
      • 特点

原型模式

原型模式是软件开发中的一种创造设计模式。当要创建的对象类型由原型实例确定时使用,该实例被克隆以生成新对象。使用原型实例指定要创建的对象的种类,并通过复制此原型来创建新对象。

首先,应该注意原型模式不是用来获得性能优势的。它仅用于从原型实例创建新对象

其次克隆这个对象不需要使用构造函数

然后,我们可能想要通父类指针或引用把指向的子类对象克隆出来,那么克隆可能会在父类和子类之间进行,并且可能是动态的,很明显通过父类的拷贝构造函数无法实现对子类对象的拷贝。

结构

在原型模式结构图中包含如下几个角色:

  • Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
  • ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  • Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

⚠️注意:**浅克隆(浅复制)深克隆(深复制)**之间的区别

特性浅克隆 (Shallow Copy)深克隆 (Deep Copy)
内存分配不分配新内存,仅复制指针地址分配新的内存空间存放数据副本
独立性对象间共享底层数据,不独立对象间完全独立,互不影响
默认性C++ 默认生成的拷贝构造函数需要程序员手动编写代码实现
适用场景对象不包含指针或动态分配的资源对象包含指针、文件句柄或网络连接
崩溃风险高(易出现悬挂指针或重复释放)低(管理得当则非常安全)

实现

#include<iostream>usingnamespacestd;//PrototypeclassGermaSoldier{public:virtualGermaSoldier*clone()=0;virtualstringwhoAmI()=0;virtual~GermaSoldier(){}};//ConcretePrototypeclassSoldier66:publicGermaSoldier{public:GermaSoldier*clone()override{returnnewSoldier66(*this);}stringwhoAmI()override{returnstring("我是杰尔马66的超级士兵!!!");}};//ConcretePrototypeclassSoldier67:publicGermaSoldier{public:GermaSoldier*clone(){returnnewSoldier67(*this);}stringwhoAmI()override{returnstring("我是杰尔马67的超级士兵!!!");}};//Clientintmain(){GermaSoldier*obj=newSoldier66;GermaSoldier*soldier=obj->clone();cout<<soldier->whoAmI()<<endl;deletesoldier;deleteobj;obj=newSoldier67;soldier=obj->clone();cout<<soldier->whoAmI()<<endl;deletesoldier;deleteobj;}

特点

主要优点

  • 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
  • 扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,将具体原型实现类写在配置文件中,增加或减少产品类对原有系统都没有任何影响。
  • 原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式就不需要这样,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(如恢复到某一历史状态),可辅助实现撤销操作。

主要缺点

  • 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”
  • 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。

适用环境

  • 创建新对象成本较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源),新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。
  • 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占用内存较少时,可以使用原型模式配合备忘录模式来实现。
  • 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 17:42:35

DDR5内存核心技术解析与三大原厂产品横评

1. 内存技术演进与DDR5的时代意义我们正处在一个数据爆炸的时代&#xff0c;无论是个人电脑上的大型游戏、视频剪辑&#xff0c;还是数据中心里的人工智能训练、大数据分析&#xff0c;都对内存的带宽、容量和能效提出了前所未有的要求。正是在这样的背景下&#xff0c;DDR5内存…

作者头像 李华
网站建设 2026/5/8 17:41:33

3分钟永久激活Windows和Office:KMS_VL_ALL_AIO智能激活脚本终极指南

3分钟永久激活Windows和Office&#xff1a;KMS_VL_ALL_AIO智能激活脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文…

作者头像 李华
网站建设 2026/5/8 17:40:59

从Microsemi收购Actel看高可靠性FPGA与模拟技术的融合战略

1. 从一则旧闻聊起&#xff1a;当模拟巨头遇见数字新贵2010年10月&#xff0c;一则新闻在半导体圈&#xff0c;特别是可编程逻辑和军工航天领域的设计师中&#xff0c;激起了不小的涟漪。Microsemi公司宣布以大约4.3亿美元的价格收购Actel公司。当时&#xff0c;EE Times的编辑…

作者头像 李华
网站建设 2026/5/8 17:40:22

从心脏超声看高精度测量系统:信号链、工程思维与可靠性设计

1. 一次心脏超声检查引发的工程思考作为一名在测试测量领域摸爬滚打了二十多年的工程师&#xff0c;我早已习惯用看待电路和信号的方式去审视周围的世界。昨天早上的年度心脏科复查&#xff0c;又一次印证了这一点。这当然和情人节无关&#xff0c;纯粹是时间上的巧合。我的长期…

作者头像 李华
网站建设 2026/5/8 17:40:06

Cadence网站介绍与智能手机相机好坏因素分析

【Cadence的网站】部分更改需重新加载页面后生效&#xff0c;如减少动画效果和调用印章。Cadence网站有以下分类&#xff1a;Cadence&#xff01;包含[主页与关于]、[联系我们]、[捐赠]。想法包含[博客]、[电子游戏]、[食谱]。创作包含[项目]、[VRChat]、[绘画作品]、[Game Boy…

作者头像 李华