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

原型模式详解(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&#xff…...

安装并配置 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安装指定版本的包

个人博客地址&#xff1a;pip安装指定版本的包 | 一张假钞的真实世界 使用以下命令安装指定版本的包&#xff1a; # pip install pyspark2.3.3...

【pytest】获取所有用例名称并存于数据库

数据库操作包&#xff0c;引用前面创建的py文件&#xff0c;【sqlite】python操作sqlite3&#xff08;含测试&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-11 8:45 # Author : duxiaowei # File : get_filename.py # Software: 这个文…...

Java中原子操作的实现原理

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

25农村发展研究生复试面试问题汇总 农村发展专业知识问题很全! 农村发展复试全流程攻略 农村发展考研复试真题汇总

农村发展复试当然有好的建议&#xff01;前提是复试重点面试题背好&#xff01; 你是不是也在为农村发展考研复试发愁&#xff1f;担心自己准备不充分、表现不好&#xff1f;别急&#xff01;今天&#xff0c;学姐——复试面试拿下90分成功上岸的学姐&#xff0c;来给大家分享…...

IDEA运行Tomcat出现乱码问题解决汇总

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

智慧医疗能源事业线深度画像分析(上)

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

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#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.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...