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

二十三种模式之原型模式(类比制作陶器更好理解一些)

1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 什么是原型模式?

原型模式是一种创建型设计模式,它允许一个对象在创建另一个可定制的对象,而无需知道如何创建的细节。这种模式通过复制现有的对象来创建新的实例,而不是新建一个。原型模式的主要优点是它可以避免直接创建对象的开销,特别是当对象创建过程复杂或耗时时。

(将原型模式融入生活,更好理解)想象一下,你正在制作陶器。你有一个原始的陶器模型,你可以通过复制这个模型来创建许多相似的陶器。这个过程不需要从头开始制作每一个陶器,而是通过复制一个已经存在的模型来快速创建新的陶器。这就是原型模式的核心思想:通过复制已有对象来创建新对象,而不是每次都从头开始创建。

3. 原型模式的组成

原型模式通常包含以下角色:

  • 原型(Prototype):这是一个抽象类或接口,声明了克隆自身的接口。
  • 具体原型(Concrete Prototype):实现克隆接口以创建自己的副本。
  • 客户端(Client):使用克隆方法创建对象的实例。

4. 原型模式的实现

4.1 定义一个原型接口

首先,定义一个原型接口,它声明了一个 clone() 方法。

public interface Prototype extends Cloneable{Prototype clone();
}

4.2 创建具体原型类

然后,创建一个具体的原型类,实现 Prototype 接口,并重写 clone() 方法。

public class ConcretePrototype implements Prototype{private String id;private String value;public ConcretePrototype(String id, String value) {this.id = id;this.value = value;}@Overridepublic Prototype clone() {try {return (ConcretePrototype)super.clone();} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic String toString() {return "ConcretePrototype{" +"id='" + id + '\'' +", value='" + value + '\'' +'}';}
}

4.3 客户端代码

最后,编写客户端代码,使用原型模式创建对象的副本。

public class Main {public static void main(String[] args) {//创建一个原型实例ConcretePrototype prototype = new ConcretePrototype("1","阿伟");//克隆原型,创建一个新对象Prototype clonePrototype = prototype.clone();System.out.println("Original:" + prototype);System.out.println("Clone:" + clonePrototype);}
}

以下为运行结果:

5. 原型模式的适用场景

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

  1. 创建对象成本较大时:如果创建对象的实例非常消耗资源,使用原型模式可以避免不必要的开销。
  2. 创建对象需要很多时间:当对象的创建过程非常耗时时,原型模式可以提供一种快速的创建方式。
  3. 对象创建需要特定环境或条件:在某些情况下,对象的创建依赖于特定环境或条件,原型模式可以简化这一过程。

6. 总结

原型模式是一种强大的设计模式,它可以显著提高对象创建的效率,特别是在对象创建成本较高或需要特定条件时。通过实现 Cloneable 接口和重写 clone() 方法,我们可以轻松地在Java中实现原型模式。希望本文能帮助你更好地理解和应用原型模式。

相关文章:

二十三种模式之原型模式(类比制作陶器更好理解一些)

1. 设计模式的分类 创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。 结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。 行为型模式(十一种):状态模式、模板方…...

9.9日记录

1.常见排序算法的复杂度 1.快速排序 1.1快速排序为什么快 从名称上就能看出,快速排序在效率方面应该具有一定的优势。尽管快速排序的平均时间复杂度与“归并排序”和“堆排序”相同,但通常快速排序的效率更高,主要有以下原因。 出现最差情况…...

鸿蒙交互事件开发04——手势事件

1 概 述 手势事件是移动应用开发中最常见的事件之一,鸿蒙提供了一些方法来绑定手势事件。通过给各个组件绑定不同的手势事件,并设计事件的响应方式,当手势识别成功时,ArkUI框架将通过事件回调通知组件手势识别的结果。 …...

研1日记9

1.理解conv1d和conv2d a. 1和2处理的数据不同,1维数据和图像 b. 例如x输入形状为(32,19,512)时,卷积公式是针对512的,而19应该变换为参数中指定的输出通道。 2.“SE块”(Squeeze-and-Excitation Block)它可以帮助模…...

HAL库学习目录查询表

日期内容2024.09.11基于STM32C8T6的CubeMX:HAL库点亮LED2024.09.11STMCuBeMX新建项目的两种匪夷所思的问题2024.09.11STMCubeMX文件下载后会出现其他项目无法下载的问题...

pandas DataFrame日期字段数据处理

pandas DataFrame日期字段数据处理 1、pandas读取表格文件日期字段存入数据库不需要时分秒 在使用 pandas 读取表格文件,并将日期字段存入数据库时,如果你只关心日期部分而不需要时分秒,可以通过以下步骤来处理: 读取数据并转换日期字段: 首先,你需要读取你的数据,并确…...

swift:qwen2 VL 多模态图文模型lora微调swift

参考: https://swift.readthedocs.io/zh-cn/latest/Multi-Modal/qwen2-vl%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html 在线demo: https://colab.research.google.com/drive/16yl6Z0wxHLX3qJ5q-SIbvPn251k3r2JC?usp=sharing 安装: !git clone https://github.com/modelsc…...

Vue.js中computed的使用方法

在Vue.js中,computed 属性是基于它们的依赖进行缓存的响应式属性。只有当相关依赖发生改变时,才会重新求值。这意味着只要computed属性依赖的源数据(如data中的属性)没有发生变化,多次访问computed属性会立即返回之前的…...

python之pyecharts制作可视化数据大屏

文章目录 前言一、安装 Pyecharts二、创建 Pyecharts 图表三、设计大屏布局四、实时数据更新五、部署和展示总结前言 使用 Pyecharts 制作可视化数据大屏是一个复杂但有趣的过程,因为 Pyecharts 本身是一个用于生成 Echarts 图表的 Python 库,而 Echarts 是由百度开发的一个…...

Chrome、Edge、360及Firefox浏览器加载多个ActiveX插件的介绍

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...

裸金属服务器与云服务器的区别有哪些?

随着云计算服务的快速发展,云服务器与裸金属服务器则称为各大企业基础设施的两大核心选择,会运用在不同的场景当中,本文就来介绍一下裸金属服务器与云服务器的区别都有哪些吧! 裸金属服务器相对于云服务器来说有着卓越的性能&…...

Pr:序列设置 - VR 视频

在“新建序列”对话框的“VR 视频” VR Video选项卡,或者在“序列设置”对话框的“VR 属性” VR Properties选项卡中,允许用户创建和编辑虚拟现实 (VR) 视频序列。 VR 视频能够提供 360 沉浸式的观看体验,通常使用专门的相机进行拍摄&#xf…...

采用qt做一个命令行终端

qt做一个类似系统命令行终端的工具,方便集成到自己的软件里使用,这样能保证软件的整体性,而且是真正的做到和系统命令行终端一样的交互方式,而不是单独搞个编辑框的方式输入命令(大部分博客都是做成这个样子&#xff0…...

TQA相关

ReAct Prompting: 原理、实现与应用 ReAct Prompting(推理与行动提示)是一种引导大型语言模型(LLM)进行推理和行动的策略,广泛应用于复杂问题求解、对话生成和自动化任务等领域。ReAct Prompting 通过将模型的思考过程…...

Spring Cloud之二 微服务注册

1&#xff1a;Intellij 新建服务 user-service 2&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…...

[Web安全 网络安全]-文件上传漏洞

文章目录&#xff1a; 一&#xff1a;前言 1.什么是文件上传漏洞 2.环境 2.1 靶场 2.2 其他工具 3.木马分类 二&#xff1a;文件上传分类 1.客户端 JS绕过 2.服务端-黑名单 大小写绕过 点和空格绕过 .htaccess文件绕过 php345文件绕过 windows ::$DATA绕过 3.…...

【白话Redis】缓存雪崩、穿透、击穿、失效和热点缓存重建

快速导航 Redis不可不知的故障现象一、缓存雪崩定义&#xff1a;解决方案&#xff1a; 二、缓存穿透定义&#xff1a;解决方案一&#xff1a;解决方案二&#xff08;更普遍的做法&#xff09;&#xff1a; 三、缓存击穿定义&#xff1a;解决方案&#xff1a; 四、缓存失效Redis…...

flink增量检查点降低状态依赖实现的详细步骤

增量检查点启动恢复的时间是很久的&#xff0c;业务上不能接受&#xff0c;所以可以通过降低状态依赖来减少恢复的时间。 降低状态依赖 尽可能减少状态的复杂性和依赖关系&#xff0c;通过拆分状态或将状态外部化到其他服务中&#xff0c;从而降低恢复的开销。 实施措施&…...

Redis总结,是什么,干什么,怎么利用?

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储等应用场景 Redis主要特性 &#xff08…...

Vue3状态管理Pinia

Vue3 的 Pinia 使用指南 Pinia 是 Vue3 中官方推荐的状态管理库&#xff0c;作为 Vuex 的替代品&#xff0c;它更简洁易用&#xff0c;并且支持模块化、类型推断和 DevTools 集成。Pinia 非常适合在 Vue3 项目中管理全局状态。 1. 安装 Pinia 首先&#xff0c;我们需要在 Vu…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...