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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/228199.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java List集合(ArrayList,LinkedList,Vector)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍java List集合的三种实现类ArrayList,LinkedList,Vector以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习…

基于Eclipse+Mysql+Tomcat开发的挖掘机配件营销系统

基于EclipseMysqlTomcat开发的挖掘机配件营销系统 项目介绍💁🏻 大家都有目共睹,现在的科学技术发展很迅速。而如今,计算机应用已经完全融入到人们的生产和生活当中,特别是企业,现在的企业几乎都是离不开计…

如何解决中小制造业企业信息化难题?

中小企的信息化,难! 一、中小制造业企业信息化困难的原因主要有以下几点: 资金限制:中小制造业企业相对于大型企业来说资金有限,无法投入大量资金进行信息化建设。技术水平不足:中小制造业企业缺乏专业的…

【力扣】189. 轮转数组

【力扣】189. 轮转数组 文章目录 【力扣】189. 轮转数组1. 题目介绍2. 解法2.1 方法一:不太正规,但是简单2.2 方法二:使用额外的数组2.3 方法三:环状替换2.4 方法四:数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…

leetcode刷题详解十

188. 买卖股票的最佳时机 IV(最多买卖k次) 注意事项 这道题和最多买卖两次是一模一样的思路就是把2换成k了但是还是有几个地方需要注意的 给的整数数组可能为0k其实没有很大,可以想一下,最多为n/2(n是数组的长度) int maxProfit…

win10 tensorrt源码编译onnx

直接利用官方源码,如下图,trtexec源码在TensorRT安装目录下,双击trtexec.sln文件,使用vs2019打开源码工程。 如下图,以yolov8为例子,编译成功项目之后,设置命令行参数: --onnxd:/yo…

IDEA不支持Java8了怎么办?

IDEA不支持Java8了怎么办? 01 异常发生场景 当我准备创建一个springboot项目时,发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后,确认了是Spring Boot 不再支持 Java 8,不是我的问题,这一天终于还是来了 0…

pytest自动化测试执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…

拆解按摩器:有意思的按键与LED控制电路,学习借鉴一下!

拆解 外观和配色个人感觉还行,比较青春 拉开拉链,拆开外面的布面,里面还有一层纱面 按键部分使用魔术贴固定 拆开纱面后,看到里面的结构,整体是一个海绵 可以看到如下,电池,按键板,充电线的三条…

鸿蒙(HarmonyOS)应用开发——应用程序入口UIAbility

概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互 UIAbility是系统调度的单元,为应用提供窗口在其中绘制界面 应用程序的几种交互界面形式 点击桌面图标进入应用 一个应用拉起另一个应用 最近任务列表切回应用 每一个UI Abili…

Rabbitmq发送邮件并消费邮件

📑前言 本文主要是【Rabbitmq】——Rabbitmq发送邮件并消费邮件的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1…

java三大集合类--List

List Set Map 一、List 几个小问题: 1、接口可以被继承吗?(可以) 2、接口可以被多个类实现吗?(可以) 3、以下两种写法有什么区别? //List list1new List();是错误的因为List()…