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

8.原型模式(Prototype)

动机

在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。

之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多,但是原型模式将抽象基类合并。

原型模式的应用场景

原型模式特别适用于以下场景:

  • 对象的创建过程比较复杂或耗时。
  • 需要动态创建对象,且对象的类型在运行时才能确定。
  • 需要避免重复初始化对象的开销。
#include <iostream>
#include <memory>
#include <string>// 抽象类
class ISplitter {
public:virtual void split() = 0;virtual std::unique_ptr<ISplitter> clone() const = 0; // 返回一个智能指针virtual ~ISplitter() {}
};// 二进制拆分器
class BinarySplitter : public ISplitter {
private:std::string data; // 假设这是需要拆分的二进制数据
public:BinarySplitter(const std::string& data) : data(data) {}void split() override {std::cout << "Splitting binary data: " << data << std::endl;// 具体的二进制拆分逻辑}std::unique_ptr<ISplitter> clone() const override {return std::make_unique<BinarySplitter>(*this); // 深拷贝}
};// 文本拆分器
class TxtSplitter : public ISplitter {
private:std::string data; // 假设这是需要拆分的文本数据
public:TxtSplitter(const std::string& data) : data(data) {}void split() override {std::cout << "Splitting text data: " << data << std::endl;// 具体的文本拆分逻辑}std::unique_ptr<ISplitter> clone() const override {return std::make_unique<TxtSplitter>(*this); // 深拷贝}
};// 使用示例
int main() {// 创建原始对象BinarySplitter binarySplitter("01010101");TxtSplitter txtSplitter("Hello, World!");// 克隆对象std::unique_ptr<ISplitter> binaryClone = binarySplitter.clone();std::unique_ptr<ISplitter> txtClone = txtSplitter.clone();// 使用克隆对象binaryClone->split();txtClone->split();return 0;
}

模式定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

什么时候使用原型,什么时候使用工厂最大的区分点就在于:用工厂方法创建对象是不是非常简单的几个步骤就可以把这个对象创建出来,还是说需要考虑对象很复杂的中间状态,然后又很希望保留这个中间状态,如果是后者的话就用原型。

要点总结

Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。

Prototype模式对于“如何创建易变类”的实体对象“采用”原型克隆的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方Clone。

Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。

相关文章:

8.原型模式(Prototype)

动机 在软件系统中&#xff0c;经常面临着某些结构复杂的对象的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…...

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具(专业版)

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...

13 尺寸结构模块(size.rs)

一、size.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…...

CSS 样式化表格:从基础到高级技巧

CSS 样式化表格&#xff1a;从基础到高级技巧 1. 典型的 HTML 表格结构2. 为表格添加样式2.1 间距和布局2.2 简单的排版2.3 图形和颜色2.4 斑马条纹2.5 样式化标题 3. 完整的示例代码4. 总结 在网页设计中&#xff0c;表格是展示数据的常见方式。然而&#xff0c;默认的表格样式…...

【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】tkinter实现音乐播放器&#xff08;源码…...

javascript常用函数大全

javascript函数一共可分为五类&#xff1a; •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数&#xff1a; (1)alert函数&#xff1a;显示一个警告对话框&#xff0c;包括一个OK按钮。 (2)confirm函数&#xff1a;显…...

C#属性和字段(访问修饰符)

不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...

DeepSeek为什么超越了OpenAI?从“存在主义之问”看AI的觉醒

悉尼大学学者Teodor Mitew向DeepSeek提出的问题&#xff0c;在推特上掀起了一场关于AI与人类意识的大讨论。当被问及"你最想问人类什么问题"时&#xff0c;DeepSeek的回答直指人类存在的本质&#xff1a;"如果意识是进化的偶然&#xff0c;宇宙没有内在的意义&a…...

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…...

数据库安全管理中的权限控制:保护数据资产的关键措施

title: 数据库安全管理中的权限控制:保护数据资产的关键措施 date: 2025/2/2 updated: 2025/2/2 author: cmdragon excerpt: 在信息化迅速发展的今天,数据库作为关键的数据存储和管理中心,已经成为了企业营运和决策的核心所在。然而,伴随着数据规模的不断扩大和数据价值…...

Leetcode598:区间加法 II

题目描述&#xff1a; 给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大…...

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...

SAP HCM insufficient authorization, no.skipped personnel 总结归纳

导读 权限:HCM模块中有普通权限和结构化权限。普通权限就是PFCG的权限&#xff0c;结构化权限就是按照部门ID授权&#xff0c;颗粒度更细&#xff0c;对分工明细化的单位尤其重要&#xff0c;今天遇到的问题就是结构化权限的问题。 作者&#xff1a;vivi&#xff0c;来源&…...

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…...

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…...

Shadow DOM举例

这东西具有隔离效果&#xff0c;对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...

力扣动态规划-18【算法学习day.112】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.下降路径最小和 题目链接:931. …...

网络基础

协议 协议就是约定 网络协议是协议中的一种 协议分层 协议本身也是软件&#xff0c;在设计上为了更好的模块化&#xff0c;解耦合&#xff0c;也是设计成为层状结构的 两个视角&#xff1a; 小白&#xff1a;同层协议&#xff0c;直接通信 工程师&#xff1a;同层协议&…...

使用 EXISTS 解决 SQL 中 IN 查询数量过多的问题

在 SQL 查询中&#xff0c;当我们面对需要在 IN 子句中列举大量数据的场景时&#xff0c;查询的性能往往会受到显著影响。这时候&#xff0c;使用 EXISTS 可以成为一种优化的良方。 问题的来源 假设我们有两个表&#xff0c;orders 和 customers&#xff0c;我们需要查询所有…...

ANSYS模态分析后,如何用MATLAB把导出的HB格式刚度矩阵变回普通矩阵?(附完整命令流)

ANSYS模态分析后HB格式刚度矩阵的MATLAB转换全流程解析 在结构动力学和有限元分析领域&#xff0c;ANSYS与MATLAB的协同工作已经成为科研人员和工程师的标配工作流。模态分析作为结构动态特性研究的基础&#xff0c;其刚度矩阵的导出与后续处理尤为关键。然而&#xff0c;当您从…...

springboot+vue基于web的校园招聘求职系统

目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分关键技术实现数据安全设计扩展性考虑项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块划分 后端&#xff08;S…...

如何使用usearch构建精准视频内容推荐系统:基于观看历史的向量匹配方案

如何使用usearch构建精准视频内容推荐系统&#xff1a;基于观看历史的向量匹配方案 【免费下载链接】usearch Fast Open-Source Search & Clustering engine for Vectors & Arbitrary Objects in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoL…...

图解Linux内核DRM框架:从用户态ioctl到plane更新的完整数据流(以4.14版本为例)

图解Linux内核DRM框架&#xff1a;从用户态ioctl到plane更新的完整数据流&#xff08;以4.14版本为例&#xff09; 在图形显示技术领域&#xff0c;Linux内核的DRM&#xff08;Direct Rendering Manager&#xff09;框架扮演着核心角色。本文将聚焦于DRM_IOCTL_MODE_SETPLANE这…...

从手动压枪到智能辅助:探索罗技鼠标宏在PUBG中的进化之路

从手动压枪到智能辅助&#xff1a;探索罗技鼠标宏在PUBG中的进化之路 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 当你在绝地求生的激烈对枪中…...

转行AIGC,杭州培训助你3个月入职大厂

转行AIGC&#xff0c;杭州培训助你3个月入职大厂 最近&#xff0c;很多小伙伴私信我&#xff0c;说想转行做AIGC相关工作&#xff0c;但苦于没有方向&#xff0c;不知道从哪里入手。今天就给大家分享一个真实案例&#xff0c;看看他是如何在短短3个月内成功转型&#xff0c;并…...

从攻到防:实战演练基于Wireshark与Snort的DoS攻击检测

1. 拒绝服务攻击初探&#xff1a;原理与危害剖析 想象一下周末去热门餐厅吃饭的场景。当所有座位都被占满&#xff0c;门口还不断涌入大量"假顾客"时&#xff0c;真正的食客就会被挡在门外——这就是拒绝服务攻击&#xff08;DoS&#xff09;的生动写照。作为网络安…...

AI Agent工程师进阶指南:掌握核心技能,冲击高薪(P7-P8必备)!

本文详细介绍了AI Agent工程师的能力分层&#xff0c;从API调用工程师到系统设计工程师再到基础设施架构师&#xff0c;明确了不同层级的能力要求和市场现状。文章深入剖析了核心技术栈&#xff0c;包括向量数据库、RAG系统、Agent架构、Memory系统以及生产化工程等关键领域&am…...

告别云端依赖:AnythingLLM本地Whisper实现完全离线语音转文字

告别云端依赖&#xff1a;AnythingLLM本地Whisper实现完全离线语音转文字 【免费下载链接】anything-llm The all-in-one AI productivity accelerator. On device and privacy first with no annoying setup or configuration. 项目地址: https://gitcode.com/GitHub_Trendi…...

掌机影音革命:wiliwili跨设备媒体中心实战指南

掌机影音革命&#xff1a;wiliwili跨设备媒体中心实战指南 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 在移…...