原型模式(Prototype)
原型模式是一种创建型设计模式,使调用方能够复制已有对象,而又无需使代码依赖它们所属的类。当有一个类的实例(原型),并且想通过复制原型来创建新对象时,通常会使用原型模式。
The Prototype pattern is generally used when we have an instance of the class (prototype) and we'd like to
create new objects by just copying the prototype.
结构设计
原型模式包含如下角色:
Prototype,原型类,用来声明克隆方法。在绝大多数情况下,只会有一个名为 clone 的方法。
ConcretePrototype,具体原型类,用来实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象和梳理递归依赖等等。
原型模式类图表示如下:

伪代码实现
接下来将使用代码介绍下原型模式的实现。
// 1.定义原型接口,用来声明克隆方法
public interface Prototype {/*** 复制对象** @return 复制后的对象*/Prototype clone();
}
// 2、定义具体原型类(ConcretePrototype),用来实现克隆方法
public class ConcretePrototype implements Prototype {private String field;public ConcretePrototype() {}public String getField() {return field;}public ConcretePrototype(String field) {this.field = field;}@Overridepublic Prototype clone() {ConcretePrototype concretePrototype = new ConcretePrototype();concretePrototype.field = this.field;return concretePrototype;}
}
// 3、客户端调用
public class PrototypeClient {public PrototypeClient() {}// 调用方式:调用具体原型实例的克隆方法public void test() {Prototype concretePrototype = new ConcretePrototype("foo");ConcretePrototype clonedPrototype = (ConcretePrototype) concretePrototype.clone();System.out.println(clonedPrototype.getField());}
}
需要说明的是,对于Java语言来说,Object基类已经提供了一个clone的保护方法,用于实现对象的浅复制。注意,只有实现了Cloneable接口才可以调用该方法,
否则抛出CloneNotSupportedException异常。更多clone方法的介绍,可以参考笔者之前的文章。
适用场景
在以下情况下可以考虑使用原型模式:
(1) 如果需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。
例如,代码里需要处理第三方接口传递过来的对象时,即使不考虑代码耦合的情况, 调用方的代码也不能依赖这些对象所属的具体类,因为无法知道它们的具体信息。
原型模式,可以为调用方提供一个通用接口,调用方可通过这一接口与所有实现了克隆的对象进行交互,它也使得调用方与其所克隆的对象具体类独立开来。
(2) 如果子类的区别仅在于其对象的初始化方式,那么可以使用原型模式来减少子类的数量。
在原型模式中, 可以使用一系列预生成的、各种类型的对象作为原型(原型对象池)。客户端不必根据需求对子类进行实例化,只需找到合适的原型并对其进行克隆即可。
优缺点
原型模式有以下优点:
(1) 将对象克隆与对象所属的具体类分离(解耦),避免克隆对象与具体类的紧耦合。
(2) 简化了复杂对象的初始化代码。对一些复杂对象,可以通过提供克隆方法来简化调用方的使用。
(3) 提供了除继承以外的方式来实现复杂对象的初始化。继承建立了子类与父类的强耦合,如果可以,尽量不要使用继承。
但是原型模式也存在以下缺点:
(1) 在重写克隆方法时,对于复杂对象的关联对象或递归依赖等处理相比麻烦一些。
参考
《设计模式:可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著 李英军, 马晓星 等译
https://www.cnblogs.com/adamjwh/p/9033550.html 简说设计模式——原型模式
https://refactoringguru.cn/design-patterns/prototype 原型模式
https://www.baeldung.com/java-pattern-prototype Prototype Pattern in Java
相关文章:
原型模式(Prototype)
原型模式是一种创建型设计模式,使调用方能够复制已有对象,而又无需使代码依赖它们所属的类。当有一个类的实例(原型),并且想通过复制原型来创建新对象时,通常会使用原型模式。 The Prototype pattern is g…...
深度学习之用PyTorch实现线性回归
代码 # 调用库 import torch# 数据准备 x_data torch.Tensor([[1.0], [2.0], [3.0]]) # 训练集输入值 y_data torch.Tensor([[2.0], [4.0], [6.0]]) # 训练集输出值# 定义线性回归模型 class LinearModel(torch.nn.Module):def __init__(self):super(LinearModel, self)._…...
45.248.11.X服务器防火墙是什么,具有什么作用
防火墙是一种网络安全设备或软件,服务器防火墙的作用主要是在服务器和外部网络之间起到一个安全屏障的作用,保护计算机网络免受未经授权的访问、恶意攻击或不良网络流量的影响,保护服务器免受恶意攻击和非法访问。它具有以下功能:…...
如何以无服务器方式运行 Go 应用程序
Go编程语言一直以来都对构建REST API提供了丰富的支持。这包括一个出色的标准库(net/HTTP),以及许多流行的包,如Gorilla mux、Gin、Negroni、Echo、Fiber等。使用AWS Lambda Go运行时,我们可以使用Go构建AWS Lambda函数…...
小程序商城系统的开发方式及优缺点分析
小程序商城系统是一种新型的电子商务平台,它通过小程序的形式为商家提供了一种全新的销售渠道,同时也为消费者提供了一种便捷的购物体验。小程序商城系统具有低成本、快速上线、易于维护等特点,因此在市场上受到了广泛的关注和应用。这里就小…...
[数据集][目标检测]城市道路井盖破损丢失目标检测1377张
数据集制作单位:未来自主研究中心(FIRC) 数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1377 标注数量(xml文件个数):1377 标注类别数&a…...
【Spring Cloud 三】Eureka服务注册与服务发现
系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka?二、为什么要有服务注册发现中心?三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…...
WPF实战学习笔记21-自定义首页添加对话服务
自定义首页添加对话服务 定义接口与实现 添加自定义添加对话框接口 添加文件:Mytodo.Dialog.IDialogHostAware.cs using Prism.Commands; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Linq; using System.Tex…...
AngularJS学习(一)
目录 1. 引入 AngularJS2. 创建一个 AngularJS 应用3. 控制器(Controller)4. 模型(Model)5. 视图(View)6. 指令(Directive)7. 过滤器(Filter)8. 服务…...
918. 环形子数组的最大和
918. 环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i 1) % n] , nums[i] 的前一个元素是…...
AI算法图形化编程加持|OPT(奥普特)智能相机轻松适应各类检测任务
OPT(奥普特)基于SciVision视觉开发包,全新推出多功能一体化智能相机,采用图形化编程设计,操作简单、易用;不仅有上百种视觉检测算法加持,还支持深度学习功能,能轻松应对计数、定位、…...
C语言文件指针设置偏移量--fseek
一、fseek fseek是设置文件指针偏移量的函数,具体传参格式为: int fseek(FILE *stream, long int offset, int whence) 返回一个整数,其中: 1、stream是指向文件的指针 2、offset是偏移量,一般是指相对于whence的便…...
快速消除视频的原声的技巧分享
网络上下载的视频都会有视频原声或者背景音乐,如果不喜欢并且想更换新的BGM要怎么操作呢?今天小编就来教你如何快速给多个视频更换新的BGM,很简单,只需要将原视频的原声快速消音同时添加新的背景音频就行,一起来看看详…...
lua脚本实现Redis令牌桶限流
背景 令牌桶限流是一种常见的流量控制算法,用于控制系统的请求处理速率,防止系统过载。在令牌桶限流算法中,可以将请求看作是令牌,而令牌桶则表示系统的处理能力。系统在处理请求时,首先需要从令牌桶中获取令牌&#…...
最新 23 届计算机校招薪资汇总
24 届的秋招提前批已经开始了,比如米哈游、oppoe、tplink 等公司都已经录取开启提前批。 像腾讯、字节、阿里等一线大厂的话,根据往年的情况,估计是 7月下-8 月初。 所以今年参加秋招的同学,要抓紧复习了。 提前批通常就持续不到…...
BUU CODE REVIEW 1
BUU CODE REVIEW 1 考点:PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…...
django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)
一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …...
认识springboot 之 了解它的日志 -4
前言 本篇介绍springboot的日志,如何认识日志,如何进行日志持久化,通过日志级别判断信息,了解Lombok插件的使用,通过Lombok自带注释更简洁的来完成日志打印,如有错误,请在评论区指正࿰…...
关于大规模数据处理的解决方案
大规模数据处理已经成为了现代商业和科学的核心。随着互联网普及和物联网技术的发展,越来越多的数据被收集和存储,这些数据包含了各种各样的信息,例如客户行为、传感器读数、社交媒体活动等等。这些数据的数量和复杂性已经超出了传统数据处理…...
免费快速下载省市区县行政区的Shp数据
摘要:一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析,本文简单介绍了如何在互联网上下载省,市,区县的shp格式空间边界数据,并介绍了一个好用的在线数据转换工具,并且开源。 一、首先&am…...
3分钟搭建免费B站视频解析服务:零基础教程
3分钟搭建免费B站视频解析服务:零基础教程 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾经想要保存B站的精彩视频却不知道如何操作?或者需要在自己的网站上嵌入B站视…...
2026职业红利:AI智能体运营岗位培训如何助你实现高薪跨越?
导读: 2026年,职场竞争的底层逻辑已悄然改变。当传统运营还在为写一段文案、剪一个视频熬夜时,掌握了 AI 智能体技术的“新运营人”已经通过自动化工作流,实现了 10 倍速的产出。目前,市场对AI智能体运营经理、AI内容策…...
uniapp 雪花算法封装类
1. uniapp 雪花算法封装类 雪花算法(SnowFlake)生成64位整数ID,具有全局唯一、趋势递增、高性能等特点,适合分布式系统。 1.1. 解决分布式全局唯一ID的方法 1.1.1. UUID UUID做全局ID的弊端:UUID是由数字加字母的形式组成,无法保持递增,它使得聚簇索引(主键值和行数据…...
Phi-3-mini-4k-instruct-gguf应用案例:HR招聘话术生成、产品FAQ自动整理、日报模板填充
Phi-3-mini-4k-instruct-gguf应用案例:HR招聘话术生成、产品FAQ自动整理、日报模板填充 1. 模型简介 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型,特别适合处理问答、文本改写和内容整理等任务。这个GGUF版本的模型经过优化࿰…...
GLM-OCR实操手册:Web界面上传PNG/JPG/WEBP三格式兼容性验证与建议
GLM-OCR实操手册:Web界面上传PNG/JPG/WEBP三格式兼容性验证与建议 1. 项目概述与测试背景 GLM-OCR是一个基于先进多模态架构的OCR识别模型,专门为处理复杂文档而设计。它不仅能识别普通文字,还能准确识别表格结构和数学公式,在实…...
09. CSS生成艺术创作指南:用代码绘制视觉诗篇
09. CSS生成艺术创作指南:用代码绘制视觉诗篇 引言 CSS 不仅仅是样式语言,它也是一种创作艺术的工具。通过 CSS,我们可以创建出令人惊叹的生成艺术作品,这些作品不仅美观,而且具有动态性和交互性。作为一名把代码当散文…...
保姆级教程:用ESP32-P4和ST7703屏打造24fps高清视频轮播器(附完整代码)
ESP32-P4与ST7703屏实战:24fps高清视频轮播系统全流程解析 当一块性能强劲的嵌入式开发板遇到高分辨率显示屏,会碰撞出怎样的火花?本文将带您从零构建一个基于ESP32-P4和ST7703屏幕的高清视频轮播系统,实现稳定的24fps播放效果。不…...
移植U-Boot驱动到XSDK裸机程序:以RTL8211FS在Zynq上的网络调试为例
移植U-Boot驱动到XSDK裸机程序:以RTL8211FS在Zynq上的网络调试为例 在嵌入式开发中,驱动移植是一项常见但极具挑战性的任务。当我们需要将已经在U-Boot或Linux环境下稳定工作的硬件驱动移植到裸机环境时,往往会遇到各种意料之外的问题。本文…...
Arduino蓝牙TPMS解析库:7字节广告数据逆向与嵌入式解码实践
1. BluetoothTPMS 库技术解析:面向嵌入式系统的蓝牙胎压监测数据解码实践1.1 项目定位与工程价值BluetoothTPMS 是一个专为 Arduino 平台设计的轻量级开源库,核心目标是实现对低成本商用 TPMS(Tire Pressure Monitoring System)传…...
YOLOv8特征可视化实战:如何用3种合并模式优化模型调试(附完整代码)
YOLOv8特征可视化实战:3种合并模式优化模型调试的工程实践 在计算机视觉领域,理解神经网络内部工作机制一直是提升模型性能的关键。YOLOv8作为当前最先进的实时目标检测框架之一,其内部特征层的可视化分析能够为模型调试提供直观依据。然而&a…...
