原型模式详解(Java)
原型模式(Prototype Pattern),作为一种极具代表性的创建型设计模式,其核心思想在于通过复制,亦即克隆现有的对象,来达成创建新对象的目的,而非依赖传统的构造函数途径。这一模式巧妙地基于现有对象的克隆机制,实现在运行时动态地创建对象,同时有效地规避因频繁创建对象而引发的资源消耗问题。本文将全面且深入地探讨原型模式的内涵,并通过 Java 示例来直观地展现其具体实现过程。
原型模式的关键角色
在原型模式的结构体系中,通常涵盖以下至关重要的角色:
1. 抽象原型(Prototype) :这一角色明确定义了克隆方法的接口规范,所有具体原型类都必须无一例外地实现该接口。它充当了克隆操作的基石,为后续的克隆行为提供了统一的接口标准。
2. 具体原型(Concrete Prototype) :具体原型类忠实实现了抽象原型接口中规定的克隆方法,细致地提供了克隆操作的具体实现逻辑。它是实际进行克隆操作的主要载体,能够依据自身的状态信息生成与之对应的克隆对象。
3. 原型管理器(Prototype Manager) :原型管理器角色肩负着管理原型对象创建、注册以及复制操作的重大职责。在实际使用中,我们可以通过原型管理器便捷地获取新的对象实例,从而简化对象的创建流程,提高系统的整体效率。
克隆方式:浅复制与深复制
在原型模式的实施过程中,克隆操作被划分为浅复制和深复制两种截然不同的方式:
● 浅复制 :仅针对对象本身进行复制,而对于对象所引用的其他对象则不予复制。换言之,新对象与原始对象在引用类型属性上是共享的,这意味着对其中一个对象的修改可能会影响到另一个对象的状态。
● 深复制 :不仅复制对象本身,还递归地对对象引用的所有其他对象进行复制。如此一来,新对象与原始对象之间实现了完全的独立,彼此没有任何引用上的共享,确保了对象状态的完整隔离。
Java 示例
接下来,我们将通过一个简明扼要的 Java 示例来生动地展示原型模式的具体实现过程,同时涵盖浅克隆和深克隆的示范。
首先,定义一个抽象原型接口,其代码如下所示:
public interface Prototype {Prototype clone();
}
该接口仅仅声明了一个 clone
方法,用于后续实现克隆操作。
然后,我们创建一个具体原型类,并实现克隆方法,具体代码如下:
public class Shape implements Prototype {public int x;public int y;public String color;public Shape() {}@Overridepublic Shape clone() {return new Shape(this);}public Shape(Shape target) {if (target!= null) {this.x = target.x;this.y = target.y;this.color = target.color;}}
}
在上述代码中,我们通过传递现有对象到构造函数的方式来实现浅克隆,新对象仅复制了基本类型属性,从而确保了与原始对象在值上的独立性。
对于深克隆的场景,假设 Shape
类拥有一个引用类型属性 Line
,为了确保 Line
对象也被完整复制,我们需要对 Line
对象进行深克隆。以下是深克隆的实现示例代码:
public class Shape implements Prototype {public int x;public int y;public String color;public Line line;public Shape() {}@Overridepublic Shape clone() {Shape clonedShape = new Shape(this);clonedShape.line = line.clone(); // 深克隆 line 对象return clonedShape;}public Shape(Shape target) {if (target!= null) {this.x = target.x;this.y = target.y;this.color = target.color;this.line = target.line;}}
}
在此示例中,我们通过递归调用 Line
对象的 clone
方法,确保了 Shape
对象及其引用的 Line
对象都得到了完整的复制,从而实现了深克隆的效果。
适用场景
原型模式在以下多种场景中展现出了极高的适用性和价值:
1. 当对象的创建过程异常复杂或者耗时较长时,借助复制一个已经创建完成的实例来获取新的实例,能够显著提升性能,避免因重复创建而带来的资源浪费。
2. 当一个类的实例之间相互独立,并且具有相同的结构特征时,采用原型模式可以极大地简化创建过程,提高代码的复用性。
3. 在需要创建大量相同或相似对象的情境下,使用原型模式能够有效避免重复创建对象,降低系统的负担,提升整体运行效率。
小结
原型模式通过巧妙地克隆现有对象来创建新对象,成功地避开了创建对象时繁重的初始化和构造过程,从而显著提高了系统的性能以及资源利用率。在应用原型模式时,我们务必高度重视克隆对象的深拷贝和浅拷贝问题,依据实际需求审慎选择合适的克隆方式,以确保系统的稳定性和效率。
通过上述详尽的解释和示例,我们可以清晰地看到原型模式在 Java 中的具体应用场景及其不可忽视的重要性。熟练掌握原型模式,将有助于在实际开发工作中大幅提升代码的复用性和性能,为系统架构的优化奠定坚实的基础
相关文章:
原型模式详解(Java)
原型模式(Prototype Pattern),作为一种极具代表性的创建型设计模式,其核心思想在于通过复制,亦即克隆现有的对象,来达成创建新对象的目的,而非依赖传统的构造函数途径。这一模式巧妙地基于现有对…...
内存条2R×4 2400和4R×4 2133的性能差异
内存条2R4 2400和4R4 2133的性能差异 2R4 2400 和 4R4 2133 是两种不同的内存条规格,主要在Rank数量和频率上有所不同,具体性能差异如下: 1. Rank数量 2R4:表示内存条有2个Rank,每个Rank有4个内存芯片。4R4ÿ…...
安装并配置 MySQL
MySQL 是世界上最流行的开源关系型数据库管理系统之一,因其高性能、可靠性和易用性而被广泛应用于各种规模的企业级应用中。本文将详细介绍如何在不同的操作系统上安装和配置 MySQL,帮助你快速搭建起一个功能完善的数据库环境。 选择适合你的安装方式 …...
常用的网络安全设备
一、 WAF 应用防火墙 范围:应用层防护软件 作用: 通过特征提取和分块检索技术进行模式匹配来达到过滤,分析,校验网络请求包的目的,在保证正常网络应用功能的同时,隔绝或者阻断无效或者非法的攻击请求 可…...

【蓝桥】线性DP--最快洗车时间
题目描述 解题思路 完整代码 举例 总结 基于 0/1 背包思想 解决 洗车时间分配问题,本质上是子集和问题【给定一个 正整数数组 nums 和一个目标值 target,判断是否可以从 nums 选择 若干个数(每个数最多选一次),使…...
Spring Boot比Spring多哪些注解?
Spring Boot 相比 Spring 多了很多自动化配置和简化开发的注解,主要包括以下几类: Spring Boot 启动与自动配置相关Spring Boot 配置相关Spring Boot Web 相关Spring Boot 测试相关Spring Boot 条件装配相关Spring Boot 监控与 Actuator 相关 1. Spring…...

springboot021校园周边美食探索及分享平台
版权声明 所有作品均为本人原创,提供参考学习使用,如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言:Javavue。 框架:后端spingboot前端vue。 模式:B/S。 数据库:mysql。 开…...

【网络通信】传输层之UDP协议
【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …...
Python环境搭建与量化交易开发:从基础到实战
Python环境搭建与量化交易开发:从基础到实战 在量化交易领域,Python因其强大的数据处理能力和丰富的库支持而成为首选编程语言。本文将指导您如何在本地搭建一个适合量化交易的Python环境,并介绍一些实用的工具和技巧。 《QMT开通规则分享》…...
软著申请(六)软著返修流程【2025年最新版】
软著申请(六)软著返修流程【2025年最新版】 一、软著返修流程1、软著返修流程须知2、相关细节二、针对大模型特殊补正条件三、备注本服务提供详细的软件著作权申请流程指导。申请人严格按照指导步骤完成申请,若最终未能成功获得著作权登记,可联系服务提供方进行免费咨询和指…...
SOUI基于Zint生成Code11码
Code 11 是一种高密度的数字条形码,主要用于标识电信设备和电子元件。它的名称来源于其能够编码 11 种字符:数字 0-9 和连接符 -。Code 11 是一种双向可读的条形码,支持校验位以提高数据准确性。 在使用BARCODE_CODE11码制生成code 11码时可指…...
sqlilabs第八关
?id1 and sleep(2)-- 发现页面存在注点,使用时间盲注脚本进行注入--- import requestsdef inject_database(url):name #name用于存储猜测出的数据库名称 for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high…...

基于HAL库的按钮实验
实验目的 掌握STM32 HAL库的GPIO输入配置方法。 实现通过按钮控制LED亮灭(支持轮询和中断两种模式)。 熟悉STM32CubeMX的外部中断(EXTI)配置流程。 实验硬件 开发板:STM32系列开发板(如STM32F103C8T6、N…...

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…...
prompt技术结合大模型 生成测试用例
要利用prompt技术结合大模型对目标B/S架构软件系统进行测试,以下以使用Python调用OpenAI的GPT模型进行功能测试用例生成,再借助Selenium库执行测试为例,给出一个完整的实现示例。 前提条件 安装依赖库:你需要安装openai和selenium库,可以使用以下命令进行安装:pip insta…...
【C++ 真题】P2920 [USACO08NOV] Time Management S
P2920 [USACO08NOV] Time Management S 题目描述 Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs conveniently numbered 1…N (1 < N < 1,000) to accomplish (like milking the cows, cleaning the …...
pip安装指定版本的包
个人博客地址:pip安装指定版本的包 | 一张假钞的真实世界 使用以下命令安装指定版本的包: # pip install pyspark2.3.3...
【pytest】获取所有用例名称并存于数据库
数据库操作包,引用前面创建的py文件,【sqlite】python操作sqlite3(含测试) #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-11 8:45 # Author : duxiaowei # File : get_filename.py # Software: 这个文…...

Java中原子操作的实现原理
目录 一、处理器如何实现原子操作? 1.使用总线锁保证原子性 1.使用缓存锁保证原子性 二、Java如何实现原子操作? 1)使用循环CAS实现原子操作 2)CAS实现原子操作的三大问题 3)使用锁机制实现原子操作 前言 原子&…...

25农村发展研究生复试面试问题汇总 农村发展专业知识问题很全! 农村发展复试全流程攻略 农村发展考研复试真题汇总
农村发展复试当然有好的建议!前提是复试重点面试题背好! 你是不是也在为农村发展考研复试发愁?担心自己准备不充分、表现不好?别急!今天,学姐——复试面试拿下90分成功上岸的学姐,来给大家分享…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...