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

java设计模式学习之【原型模式】

文章目录

  • 引言
  • 原型模式简介
    • 定义与用途
    • 实现方式
    • UML
  • 使用场景
  • 优势与劣势
  • 原型模式在spring中的应用
  • 员工记录示例
  • 代码地址

引言

原型模式是一种创建型设计模式,它允许对象能够复制自身,以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用,可以显著提高性能和代码的可维护性。

原型模式简介

定义与用途

原型模式使得一个对象能够创建自己的副本,从而简化对象的创建过程,尤其是当创建新实例的成本比较高时。这种模式通常用于情况下:

  • 实例化的成本比克隆高。
  • 类不容易预测需要创建哪种类的对象。
  • 需要避免与产品层次结构耦合的系统。

实现方式

原型模式通常涉及以下几个关键步骤:

  • 实现一个原型接口,该接口用于定义克隆对象的方法。
  • 通过实现原型接口的类创建具体原型。
  • 通过克隆方法创建新的对象。

UML

在这里插入图片描述

使用场景

  • 当直接创建一个对象的成本比通过克隆来创建该对象的成本高时。
  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当需要实例化的类是在运行时指定时,例如,通过动态加载。

优势与劣势

  • 优势
    提高性能:避免了新对象的初始化过程,特别是对于复杂或资源密集型对象。
    提高灵活性:可以在运行时动态地改变具体的类实例。
  • 劣势
    克隆复杂对象可能也相对复杂。
    在实现深拷贝时需要特别小心,以确保复制的对象完全独立于原型。

原型模式在spring中的应用

在Spring框架中,原型模式的应用体现在它的Bean作用域管理上。虽然Spring的默认行为是以单例模式创建和管理Bean,但它也支持原型作用域(Prototype Scope)

1.Bean的多实例创建:
当在Spring配置文件中将Bean的作用域设置为prototype时,Spring容器对每个getBean()请求都会创建一个新的Bean实例。
这意味着如果你多次请求同一个Bean,Spring会每次都创建一个新的实例,而不是返回同一个共享的实例。2.应用场景:
当你需要每次使用时都有一个新的对象实例,而不是共享实例时,原型作用域就非常有用。
例如,在应用程序中,如果你需要一个非共享的、独立的对象来处理每次的用户请求,那么就可以使用原型作用域。3.配置方式:
在Spring的XML配置中,可以通过设置scope="prototype"来指定Bean为原型作用域。
在基于注解的配置中,可以使用@Scope("prototype")注解来实现同样的效果。

员工记录示例

  1. 在我们的示例中,我们将实现一个名为Prototype的接口,它包含一个返回Prototype类型的getClone()方法。这个方法的目的是允许一个对象复制自身,从而创建一个新的对象实例。
  2. 接着,我们将创建一个具体的类EmployeeRecord,它实现了Prototype接口。EmployeeRecord类的主要功能是克隆自身对象,以此方式创建新的EmployeeRecord实例。
  3. 最后,PrototypeDemo类将使用这个具体的EmployeeRecord类来演示原型模式的实际应用。通过PrototypeDemo类,我们可以看到如何使用EmployeeRecord的克隆方法来创建新的员工记录,而无需每次都从头开始创建对象。

这个过程非常适用于需要大量相似对象的场景,例如在数据库或任何需要大量相似记录的应用中。使用原型模式,我们可以有效地克隆已有的对象,而不是每次都进行完整的创建过程,从而节省资源和时间。

Prototype

public interface Prototype {//获取当前对象的克隆public Prototype getClone();}

EmployeeRecord

public class EmployeeRecord implements Prototype {private int id;private String name, designation;private double salary;private String address;public EmployeeRecord() {System.out.println("   Oracle公司的员工记录");System.out.println("---------------------------------------------");System.out.println("员工ID" + "\t" + "姓名" + "\t" + "职位" + "\t" + "薪水" + "\t\t" + "地址");}// 带参数的构造函数,用于创建员工记录public EmployeeRecord(int id, String name, String designation, double salary, String address) {this();this.id = id;this.name = name;this.designation = designation;this.salary = salary;this.address = address;}// 显示员工记录public void showRecord() {System.out.println(id + "\t" + name + "\t" + designation + "\t" + salary + "\t" + address);}// 实现 Prototype 接口的 getClone 方法@Overridepublic Prototype getClone() {return new EmployeeRecord(id, name, designation, salary, address);}}

PrototypeDemo

public class PrototypeDemo {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.print("输入员工ID: ");int eid = Integer.parseInt(br.readLine());System.out.print("\n");System.out.print("输入员工姓名: ");String ename = br.readLine();System.out.print("\n");System.out.print("输入员工职位: ");String edesignation = br.readLine();System.out.print("\n");System.out.print("输入员工地址: ");String eaddress = br.readLine();System.out.print("\n");System.out.print("输入员工薪水: ");double esalary = Double.parseDouble(br.readLine());System.out.print("\n");// 创建原始员工记录并显示EmployeeRecord e1 = new EmployeeRecord(eid, ename, edesignation, esalary, eaddress);e1.showRecord();System.out.println("\n");// 克隆员工记录并显示EmployeeRecord e2 = (EmployeeRecord) e1.getClone();e2.showRecord();}}

以上就是一个简单的原型模式示例,来演示如何创建原始对象的副本。这种方式对于创建多个相似对象时非常有用,既节省了创建新对象的时间,又减少了代码复杂性。
运行代码:
在这里插入图片描述

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

相关文章:

java设计模式学习之【原型模式】

文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言 原型模式是一种创建型设计模式,它允许对象能够复制自身,以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用…...

链表数组插入排序

InsertSort 插入排序算法&#xff0c;比如打扑克牌的算法时&#xff0c;按照从左到右&#xff0c;找到对应的位置插入排序 最重要的是位置移动 找到对应位置值 #include "iostream" #include "bits/stdc.h"using namespace std;void sort(vector<in…...

MyBatis的创建,简单易懂的一篇blog

文章目录 一、MyBatis是什么二、操作流程三.配置resource总结 一、MyBatis是什么 MyBatis 是⼀款优秀的持久层框架&#xff0c;它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注…...

MOS管的静电击穿问题

MOS管输入电阻很高&#xff0c;为什么一遇到静电就不行了&#xff1f; 静电击穿&#xff1a;由于静电的积累导致电压超过了原本MOS的绝缘能力&#xff0c;导致电流突然增大的现象。 MOS管基础知识了解&#xff1a; G极(gate)—栅极&#xff0c;不用说比较好认 S极(source)—源…...

在线 SQL 模拟器SQL Fiddle使用简介

在线 SQL 模拟器SQL Fiddle使用简介 本文可作为“SQL语言与SQL在线实验工具的使用” https://blog.csdn.net/cnds123/article/details/115038700 一文的补充。 有时候&#xff0c;我们想去验证 SQL语句&#xff0c;却缺少数据库环境&#xff0c;那该怎么办呢&#xff1f; 这…...

仿京东淘宝商品列表筛选组件:实现一个高效的侧边栏弹框筛选功能

仿京东淘宝商品列表筛选组件&#xff1a;实现一个高效的侧边栏弹框筛选功能 一、引言 随着电子商务的快速发展&#xff0c;用户体验成为了竞争的关键因素。在众多的电商网站中&#xff0c;如京东和淘宝&#xff0c;商品列表筛选功能为用户提供了便捷的途径来找到心仪的商品。本…...

软件工程 - 第8章 面向对象建模 - 4 - 物理体系结构建模

构件图 构件图概述 构件图描述了软件的各种构件和它们之间的依赖关系。 构件图的作用 在构件图中&#xff0c;系统中的每个物理构件都使用构件符号来表示&#xff0c;通常&#xff0c;构件图看起来像是构件图标的集合&#xff0c;这些图标代表系统中的物理部件&#xff0c;…...

【智能家居】二、添加火灾检测模块(烟雾报警功能点)

可燃气体传感器 MQ-2 和 蜂鸣器 代码段 controlDevice.h&#xff08;设备控制&#xff09;smokeAlarm.c&#xff08;烟雾报警器&#xff09;buzzer.c&#xff08;蜂鸣器&#xff09;mainPro.c&#xff08;主函数&#xff09;运行结果 可燃气体传感器 MQ-2 和 蜂鸣器 代码段 …...

history和hash两种路由模式原理,和优缺点

Hash Hash 模式是在 URL 中使用井号&#xff08;#&#xff09;来作为路由的模式。在 Hash 模式下&#xff0c;即使页面刷新&#xff0c;浏览器仍然只会请求页面的初始 HTML 文件&#xff0c;所有的路由变化都会在 URL 前面添加 “#/” 符号。 原理 在 Hash 模式下&#xff0c;路…...

Nginx 具体应用

1 Nginx 1.1 介绍 一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它占有的内存少&#xff0c;并发能力强&#xff0c;中国大陆使用 nginx 的网站有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等。第一个公开版本发布于…...

计算机网络之网络传输,三次握手和四次挥手

网络传输通过高低电压 流 基本类型数组 低电压转高电压&#xff0c;通过网卡 传输模式&#xff1a; 全双工&#xff1a;互相传输且能同时传输 半双工&#xff1a;互相传输但是不能同时传输 单工&#xff1a;单向传输&#xff0c;&#xff08;键盘&#xff0c;显示器&#…...

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询&#xff0c;本文提供了设置请求的步骤。 本文还介绍了查询结构&#xff0c;并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…...

基于YOLOv8深度学习的钢材表面缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

深度学习常见回归分支算法逐步分析,各种回归之间的优缺点,适用场景,举例演示

文章目录 1、线性回归&#xff08;Linear Regression&#xff09;1.1 优点1.2 缺点1.3 适用场景1.4 图例说明 2、多项式回归&#xff08;Polynomial Regression&#xff09;2.1 优点2.2 缺点2.3 适用场景2.4 图例说明 3、决策树回归&#xff08;Decision Tree Regression&#…...

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意&#xff1a; 思路&#xff1a; 代码&#xff1a; D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意&#xff1a; 给你一个n和q&#xff0c;n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况&#xff0c;q为查询次数…...

Google测试框架googletest简介与使用方法

环境准备&#xff08;Ubuntu&#xff09; 下载 git clone https://github.com/google/googletest.git 安装 cd googletest // 创建build目录 mkdir build cd build //编译安装 cmake .. make sudo make install 检查是否安装成功 ls /usr/local/lib// 存在以下文件则说明…...

进程的创建:fork()

引入 创建进程的方式我们已经学习了一个&#xff01;在我们运行指令(或者运行我们自己写的可执行程序)的时候不就是创建了一个进程嘛&#xff1f;那个创建进程的方式称为指令级别的创建子进程&#xff01; 那如果我们想要在代码中创建进程该怎么办呢&#xff1f; fork() for…...

Fabric:创建应用通道

搭建自定义网络可以参考文章&#xff1a; https://blog.csdn.net/yeshang_lady/article/details/134113296 1 创建通道 网络搭建完成之后&#xff0c;就可以开始创建通道了。Fabric V2.5.4中可以在不创建系统通道的情况下直接创建应用通道。 1.1 修改配置文件 先创建配置文…...

力扣每日一题(2023-11-30)

力扣每日一题 题目&#xff1a;1657. 确定两个字符串是否接近 日期&#xff1a;2023-11-30 用时&#xff1a;21 m 07 s 时间&#xff1a;11ms 内存&#xff1a;43.70MB 代码&#xff1a; class Solution {public boolean closeStrings(String word1, String word2) {if(word1.…...

内部类Lambda

静态内部类 /*** 静态成员是在类加载成字节码时就已经存在的,静态只能访问静态*/ public class Demo {public static void main(String[] args) {Outer.Inner.show();} }class Outer {int num1 10;static int num2 20;static class Inner {static void show() {Outer outer …...

大学生论文降重技巧:用AI辅助,重复率轻松降到10%以下

2026年AI学术辅助工具已进入“精准合规改写、核心语义完整保留”的全新发展阶段&#xff0c;彻底解决了大学生论文降重“耗时长、改写生硬、易踩学术红线”的普遍难题。据中国高校图书馆协会2026年调研数据显示&#xff0c;超7成大学生在论文写作过程中会遇到重复率超标的问题&…...

Ubuntu 20.04下Mathematica 12.3安装全攻略(附Jupyter集成技巧)

Ubuntu 20.04下Mathematica 12.3安装与Jupyter集成实战指南 在科研计算与符号数学领域&#xff0c;Mathematica始终保持着不可替代的地位。对于Ubuntu用户而言&#xff0c;安装特定历史版本&#xff08;如12.3&#xff09;往往比最新版本更具挑战性——官方默认提供最新版下载&…...

有源vs无源晶振怎么选?从接法差异到成本对比的5个实战建议

有源与无源晶振选型指南&#xff1a;5个关键决策维度与实战技巧 在硬件设计领域&#xff0c;时钟信号如同系统的心跳&#xff0c;而晶振的选择直接影响着整个电路的稳定性和可靠性。面对市场上琳琅满目的有源和无源晶振&#xff0c;工程师常常陷入选择困境——是追求有源晶振的…...

HP20x气压传感器Arduino驱动深度解析

1. Grove Barometer HP20x 高精度气压/温度/海拔传感器驱动深度解析1.1 项目定位与工程价值Grove Barometer HP20x 是 Seeed Studio 推出的基于 HP206C&#xff08;或兼容型号 HP203B/HP202C&#xff09;高精度气压传感芯片的模块化传感器。该驱动库并非简单封装&#xff0c;而…...

OpenClaw开发环境配置:千问3.5-9B辅助的IDE插件管理

OpenClaw开发环境配置&#xff1a;千问3.5-9B辅助的IDE插件管理 1. 为什么需要AI辅助的IDE管理 作为一个长期在多个项目间切换的全栈开发者&#xff0c;我深受开发环境配置问题的困扰。每次换新电脑或者重装系统&#xff0c;光是配置VSCode插件和项目依赖就要耗费大半天时间。…...

ExtendedChars:Adafruit GFX的UTF-8扩展字符支持方案

1. 项目概述 ExtendedChars 是一个专为 Adafruit GFX 图形库设计的轻量级扩展组件&#xff0c;其核心工程目标是突破原生 GFX 库对 ASCII 字符集&#xff08;0x00–0x7F&#xff09;的硬性限制&#xff0c;实现对 UTF-8 编码多字节字符的可靠解析与渲染。该库并非重写显示驱动…...

SpringBoot整合MQTT实战:从零到一构建物联网消息通信

1. 为什么选择SpringBoot整合MQTT&#xff1f; 物联网项目开发中&#xff0c;设备与服务器的通信就像快递员送货上门。MQTT协议就是这个快递员&#xff0c;而SpringBoot就是你家门口的智能快递柜。两者结合能让设备数据像包裹一样准时送达&#xff0c;还不会丢件。 我去年做过一…...

不止System.Memory!OpenCVSharp依赖的这几个DLL报错,一个方法全搞定

深度解析OpenCVSharp依赖冲突&#xff1a;从System.Memory到通用解决方案 当你兴致勃勃地准备运行一个基于OpenCVSharp的计算机视觉项目时&#xff0c;突然弹出的"DLL加载失败"或"版本不匹配"错误信息就像一盆冷水浇灭了热情。System.Memory只是众多潜在问…...

YOLO26涨点改进| ICCV 2025 | 独家创新首发、特征融合改进篇| 引入I-SCA / V-SCA特征融合模块,含多种创新改进,助力图像融合、小目标检测、图像分割、图像分类高效涨点改进

一、本文介绍 🔥本文给大家介绍使用 I-SCA 和 V-SCA 模块(IVSCAM)改进 YOLO26 网络模型的核心作用,是在特征提取与融合阶段增强不同层级或不同来源特征之间的交互能力,使模型能够以更明确的引导方式突出关键目标区域。其中,I-SCA 更适合强化类似显著区域、热目标或高响…...

LinkSwift:重新定义网盘下载体验的八大平台直链解析工具

LinkSwift&#xff1a;重新定义网盘下载体验的八大平台直链解析工具 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...