C++实现设计模式---原型模式 (Prototype)
原型模式 (Prototype)
原型模式 是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化。
意图
- 使用原型实例指定要创建的对象类型,并通过复制该原型来生成新对象。
- 提供一种高效创建对象的方式,尤其是当对象的创建成本较高时。
使用场景
- 对象创建成本高:
- 如果直接实例化对象开销较大(如对象初始化需要大量资源),可以通过克隆已存在的对象快速生成新实例。
- 复杂对象需要重复创建:
- 当对象的结构较复杂,需要创建多个相似对象时。
- 避免直接依赖具体类:
- 原型模式通过复制实例而不是直接依赖构造函数,可以减少对具体类的依赖。
参与者角色
- 原型接口 (Prototype)
- 定义一个克隆方法,用于复制对象。
- 具体原型 (Concrete Prototype)
- 实现原型接口,定义克隆方法,返回当前实例的复制品。
- 客户端 (Client)
- 使用原型接口创建新对象,而不直接依赖具体类。
示例代码
以下示例展示了如何使用原型模式创建几种不同类型的图形对象。
#include <iostream>
#include <memory>
#include <string>// 原型接口
class Shape {
public:virtual ~Shape() {}virtual std::unique_ptr<Shape> clone() const = 0;virtual void draw() const = 0;
};// 具体原型:圆形
class Circle : public Shape {
private:int radius;public:Circle(int r) : radius(r) {}// 实现克隆方法std::unique_ptr<Shape> clone() const override {return std::make_unique<Circle>(*this);}void draw() const override {std::cout << "Drawing a Circle with radius: " << radius << std::endl;}
};// 具体原型:矩形
class Rectangle : public Shape {
private:int width, height;public:Rectangle(int w, int h) : width(w), height(h) {}// 实现克隆方法std::unique_ptr<Shape> clone() const override {return std::make_unique<Rectangle>(*this);}void draw() const override {std::cout << "Drawing a Rectangle with width: " << width<< " and height: " << height << std::endl;}
};// 客户端代码
int main() {// 创建具体原型std::unique_ptr<Shape> circlePrototype = std::make_unique<Circle>(10);std::unique_ptr<Shape> rectanglePrototype = std::make_unique<Rectangle>(20, 30);// 克隆原型auto circle1 = circlePrototype->clone();auto circle2 = circlePrototype->clone();auto rectangle1 = rectanglePrototype->clone();// 使用克隆对象circle1->draw(); // 输出:Drawing a Circle with radius: 10circle2->draw(); // 输出:Drawing a Circle with radius: 10rectangle1->draw(); // 输出:Drawing a Rectangle with width: 20 and height: 30return 0;
}
代码解析
1. 原型接口
- 定义了
clone()方法,用于创建当前对象的副本:
virtual std::unique_ptr<Shape> clone() const = 0;
2. 具体原型类
Circle和Rectangle是具体原型类,分别实现了clone()方法,返回自身的副本:
std::unique_ptr<Shape> clone() const override {return std::make_unique<Circle>(*this);
}
3. 客户端
- 客户端通过调用
clone()方法创建对象,而无需直接依赖具体类:
auto circle1 = circlePrototype->clone();
circle1->draw();
优缺点
优点
- 对象复制高效:
- 直接复制对象比重新实例化速度更快。
- 减少依赖:
- 客户端代码无需依赖具体类的构造函数。
- 动态创建对象:
- 可在运行时动态生成对象,而不是在编译时确定。
缺点
- 深拷贝复杂性:
- 如果对象中包含指针或其他复杂资源,需特别注意深拷贝逻辑。
- 实现复杂:
- 需要为每个类实现
clone()方法,增加了一定的代码量。
- 需要为每个类实现
适用场景
- 需要大量相似对象:如图形编辑器中需要重复创建类似图形。
- 对象初始化成本高:如大型游戏中加载模型、地图等资源。
- 需要动态生成对象:如根据配置文件动态生成对象。
改进与扩展
-
深拷贝支持
- 如果对象包含动态内存或指针成员变量,需要实现深拷贝以避免资源共享问题。
-
结合原型注册表
- 使用注册表保存所有原型实例,根据名称或类型动态克隆对象:
class PrototypeRegistry { private:std::unordered_map<std::string, std::unique_ptr<Shape>> prototypes;public:void registerPrototype(const std::string& name, std::unique_ptr<Shape> prototype) {prototypes[name] = std::move(prototype);}std::unique_ptr<Shape> create(const std::string& name) const {return prototypes.at(name)->clone();} };
总结
原型模式通过复制已有对象来快速创建新对象,避免了复杂的初始化逻辑,并减少了对具体类的依赖。
它适用于需要动态生成大量相似对象或高效创建对象的场景。
相关文章:
C++实现设计模式---原型模式 (Prototype)
原型模式 (Prototype) 原型模式 是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化。 意图 使用原型实例指定要创建的对象类型,并通过复制该原型来生成新对象。提供一种高效创建对象的方式,尤其是当对象的…...
鸿蒙面试 2025-01-10
写了鉴权工具,你在项目中申请了那些权限?(常用权限) 位置权限 : ohos.permission.LOCATION_IN_BACKGROUND:允许应用在后台访问位置信息。 ohos.permission.LOCATION:允许应用访问精确的位置信息…...
Linux Top 命令 load average 指标解读
前言 作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运…...
31_搭建Redis分片集群
Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…...
客户案例 | Ansys与索尼半导体解决方案公司合作推进自动驾驶汽车基于场景的感知测试
该合作使OEM厂商和一级供应商能够可靠地评估和验证 ADAS/AV 功能在各种天气和照明条件下的性能 主要亮点 Ansys AVxcelerate Sensors™自动驾驶汽车(AV)传感器仿真软件,可实现面向基于场景的感知测试的实时多光谱摄像头仿真 利用AVxcelerat…...
c#-Halcon入门教程——标定
Halcon代码 read_image (NinePointCalibration, D:/Desktop/halcon/ca74d-main/九点标定/NinePointCalibration.gif)rgb1_to_gray (NinePointCalibration, GrayImage)get_image_size (GrayImage, Width, Height) dev_display (GrayImage)* 获取当前显示的窗口句柄 dev_get_win…...
MC1.12.2 macOS高清修复OptiFine运行崩溃
最近在玩RLCraft,在windows中运行正常的,移植到macOS中发现如果加载OptiFine模组就会崩溃 报错日志 报错日志如下,其中已经包含了各种版本信息,我就不单独说明了。这里说一下,报错的时候用的是oracle jdk x64的&…...
精选2款.NET开源的博客系统
前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…...
转运机器人在物流仓储行业的优势特点
在智能制造与智慧物流的浪潮中,一款革命性的产品正悄然改变着行业的面貌——富唯智能转运机器人,它以卓越的智能科技与创新的设计理念,引领着物流领域步入一个全新的高效、智能、无人的时代。 一、解放双手,重塑物流生态 富唯智能…...
简识MySQL的InnoDB Locking锁的分类
( 参考官方网页: MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking) 一、InnoDB Locking锁的分类: 锁的分类英文缩写共享锁Shared LocksS排他锁Exclusive LocksX意向共享锁Intention Shared LocksIS意向排他锁Int…...
如何通过openssl生成.crt和.key
生成 .crt(证书文件)和 .key(私钥文件)的过程通常涉及使用加密工具或库来创建密钥对,并生成证书请求,最终由证书颁发机构(CA)或自签名生成证书。以下是生成 .crt 和 .key 文件的详细…...
.NetCore 使用 NPOI 读取带有图片的excel数据
在.NetCore使用NPOI插件进行批量导入时,获取Excel中的所有的图片数据,存到集合中。 1.定义类PictureData 代码如下: public class PictureData { public byte[] Data { get; set; } } 2.数据集引用 using NPOI.XSSF.UserModel; usin…...
linux上使用update-alternatives来选择软件版本
比如我在linux系统上安装多个版本的gcc /usr/local/gcc-4.8.2/ /usr/local/gcc-8.4.0/ /usr/local/gcc-9.4.0/我要根据需要来切换系统环境下的gcc命令的版本,我可以先 update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.8.2/bin/gcc 1 update-alt…...
【Elasticsearch复合查询】
Elasticsearch复合查询 在Elasticsearch中,复合查询(Compound Queries)是用来封装其他复合查询或叶子查询的查询类型。它们的主要目的是组合这些查询的结果和分数、改变它们的行为或者从查询上下文切换到过滤上下文。 一个常见的复合查询是…...
Java List去重:Stream、HashMap与TreeSet对比分析
在处理包含重复元素的List时,高效地去除重复项是提高数据质量的关键步骤。本文将详细介绍如何运用Java 8 Stream API、HashMap以及TreeSet来实现List去重,并比较它们之间的优缺点及适用场景。 1. 使用Stream API去重 List<String> duplicates …...
大师课程:专业角色AE+AI动画动态设计关键帧学院视频课程 Key Frame Academy – Character Animation Launchpad
使用专业角色动画升级您的动态设计。我将流程的每个阶段分解为易于理解的步骤,以便您可以自信、无缝地创建迫不及待地向客户展示的专业角色动画。 您的创造力就是您的超能力。但说到经验,没有什么比索具过程更能扼杀我的创作火花了……对于许多人来说&am…...
游戏盾SDK如何防护APP攻击
游戏盾SDK如何防护APP攻击?在数字时代的大潮中,APP的安全性是衡量其服务质量与用户信任度的关键指标之一。面对日益复杂多变的网络攻击,如何确保APP在开放的网络环境中稳健运行,成为开发者面临的一大挑战。游戏盾SDK,作…...
Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)
Spring Boot 3.x 整合 Logback 日志框架(支持异步写入) 在构建任何应用程序时,良好的日志管理都是必不可少的。日志可以帮助我们监控、调试和跟踪代码的运行情况。 1. 添加日志配置文件 在 /resources 资源目录下,创建名为 log…...
从0开始学习搭网站第二天
前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...
【Unity-Animator】通过 StateMachineBehaviour 实现回调
StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…...
Go语言中的字符串处理
Go语言中的字符串处理 1. 字符串的基本概念 在Go语言中,字符串是一种不可变的字节序列,使用UTF-8编码。字符串的类型为string,是Go语言的基本类型之一。 package mainimport "fmt"func main() {// 字符串字面量s1 : "Hello, W…...
抖音批量下载助手:三步实现全自动视频采集
抖音批量下载助手:三步实现全自动视频采集 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼吗?抖音批量下载助手为你提供了一套完整的自动化解决方案&am…...
STM32F407硬件COM事件实战:六步换相避坑指南(附CubeMX配置)
STM32F407硬件COM事件六步换相实战:从CubeMX配置到避坑指南 在无刷电机控制领域,六步换相是最基础也最关键的环节之一。传统软件换相方式存在PWM通道更新不同步的痛点,而STM32F407的硬件COM事件功能恰好能完美解决这个问题。本文将带您深入实…...
【衢州学院主办,上海交通大学协办 | IET出版(有ISSN号) | 往届两年已完成 EI 、 IEEE Xplore检索 | 大咖组委】第三届人工智能与电力系统国际学术会议(AIPS 2026)
第三届人工智能与电力系统国际学术会议(AIPS 2026) 2026 3rd International Conference on Artificial Intelligence and Power System 大会官网:www.icaips.org【参会投稿】 大会时间:2026年5月22-24日 大会地点:中国-浙江-衢…...
OpenClaw技能共享:将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub
OpenClaw技能共享:将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub 1. 为什么需要共享技能 去年我在处理一批市场分析报告时,发现手动从PDF中提取图表数据再制作可视化报表的效率极低。当时用OpenClawPhi-3-vision模型搭建了一个自动化分…...
G-Helper风扇控制完全指南:轻松解决华硕笔记本散热异常问题
G-Helper风扇控制完全指南:轻松解决华硕笔记本散热异常问题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...
RyTuneX深度实战:Windows系统性能调优与隐私保护最佳实践
RyTuneX深度实战:Windows系统性能调优与隐私保护最佳实践 【免费下载链接】RyTuneX RyTuneX is a cutting-edge optimizer built with the WinUI 3 framework, designed to amplify the performance of Windows devices. Crafted for both Windows 10 and 11. 项目…...
新手必看:腾讯SRC漏洞挖掘实战全记录(附详细步骤与避坑指南)
腾讯SRC漏洞挖掘实战:从零到一的完整攻防手册 第一次接触漏洞挖掘时,我盯着电脑屏幕发呆了半小时——那些专业术语像天书一样,而论坛里"轻松挖洞"的帖子更让我怀疑自己是不是选错了方向。直到在腾讯SRC提交第一个有效漏洞的那天&am…...
NLP-StructBERT在跨语言语义匹配中的惊艳效果案例
NLP-StructBERT在跨语言语义匹配中的惊艳效果案例 最近在做一个国际化产品的语义搜索功能时,遇到了一个挺头疼的问题:用户用中文提问,但我们的知识库里有大量优质的英文资料。传统的做法是先把问题翻译成英文,再去搜索࿰…...
像素剧本圣殿企业应用:中小型内容工作室剧本量产工作流搭建
像素剧本圣殿企业应用:中小型内容工作室剧本量产工作流搭建 1. 剧本创作新范式 在内容创作行业,剧本开发一直是耗时费力的核心环节。传统编剧流程中,一个完整剧本从构思到成稿往往需要数周甚至数月时间,这对于资源有限的中小型工…...
