6、原型模式(Prototype Pattern,不常用)

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。

原型模式属于创建型设计模式,它以当前对象为原型(蓝本)来创建另一个新的对象,而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现,在JavaScript中通常使用对象的原型属性实现。

原型模式的Java实现很简单,只需原型类实现Cloneable接口并覆写clone方法即可。Java中的复制分为浅复制和深复制。

  • 浅复制:Java中的浅复制是通过实现Cloneable接口并覆写其Clone方法实现的。在浅复制的过程中,对象的基本数据类型的变量值会重新被复制和创建,而引用数据类型仍指向原对象的引用。也就是说,浅复制不复制对象的引用类型数据。
    package cn.jaa.prototype_pattern;
    
    /**
     * @Author: Jaa
     * @Description: 浅复制
     * @Date 2023/11/28 22:25
     */
    public class Computer implements Cloneable {
        private String cpu;
        private String memory;
        private String disk;
    
        public Computer(String cpu, String memory, String disk) {
            this.cpu = cpu;
            this.memory = memory;
            this.disk = disk;
        }
    
        @Override
        protected Object clone() { // 浅复制
            try {
                return (Computer) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        @Override
        public String toString() {
            return "Computer{" +
                    "cpu='" + cpu + '\'' +
                    ", memory='" + memory + '\'' +
                    ", disk='" + disk + '\'' +
                    '}';
        }
    }
    
  • 深复制:在深复制的过程中,不论是基本数据类型还是引用数据类型,都会被重新复制和创建。简而言之,深复制彻底复制了对象的数据(包括基本数据类型和引用数据类型),浅复制的复制却并不彻底(忽略了引用数据类型)。
    package cn.jaa.prototype_pattern;
    
    /**
     * @Author: Jaa
     * @Description: 深复制
     * @Date 2023/11/28 22:33
     */
    public class ComputerDetail implements Cloneable {
    
        private String cpu;
        private String memory;
        private Disk disk;
    
        public ComputerDetail(String cpu, String memory, Disk disk) {
            this.cpu = cpu;
            this.memory = memory;
            this.disk = disk;
        }
    
        @Override
        protected Object clone() { // 深复制
            try {
                ComputerDetail computerDetail = (ComputerDetail) super.clone();
                computerDetail.disk = (Disk) this.disk.clone(); // 引用对象深复制
                return computerDetail;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        @Override
        public String toString() {
            return "ComputerDetail{" +
                    "cpu='" + cpu + '\'' +
                    ", memory='" + memory + '\'' +
                    ", disk=" + disk +
                    '}';
        }
    }
    package cn.jaa.prototype_pattern;
    
    /**
     * @Author: Jaa
     * @Description:
     * @Date 2023/11/28 22:34
     */
    public class Disk implements Cloneable {
        private String ssd;
        private String hhd;
    
        public Disk(String ssd, String hhd) {
            this.ssd = ssd;
            this.hhd = hhd;
        }
    
        @Override
        protected Object clone() { // 应用对象深复制
            try {
                return (Disk) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        @Override
        public String toString() {
            return "Disk{" +
                    "ssd='" + ssd + '\'' +
                    ", hhd='" + hhd + '\'' +
                    '}';
        }
    }
    

    浅复制、深复制测试:

    package cn.jaa.prototype_pattern;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * @Author: Jaa
     * @Description: simple and deep clone test
     * @Date 2023/11/28 22:41
     */
    @Slf4j
    public class PrototypeDemoTest {
    
        public static void main(String[] args) {
            // 浅复制
            Computer computer = new Computer("16core", "16G", "1TB");
            log.info("before simple clone: " + computer.toString());
            Computer computerClone = (Computer) computer.clone();
            log.info("after simple clone: " + computerClone.toString());
    
            // 深复制
            Disk disk = new Disk("256G", "1TB");
            ComputerDetail computerDetail = new ComputerDetail("16core", "16G", disk);
            log.info("before deep clone: " + computerDetail.toString());
            ComputerDetail computerDetailClone = (ComputerDetail) computerDetail.clone();
            log.info("after deep clone: " + computerDetailClone.toString());
        }
    }

    运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

参加百度Apollo技术沙龙—感受自动驾驶的魅力

2023年12月2日下午2点,我有幸参加了百度Apollo技术沙龙,这是一个围绕Apollo新版本Beta的全面升级展开的深度交流活动。作为一名工程师,我深感荣幸能够与众多同行和专家一同探讨自动驾驶技术的快速发展 在这次沙龙中,我了解到Apo…

可编程电子负载原理是怎样的

可编程电子负载是一种模拟真实负载的电子设备,它可以模拟各种不同类型和规格的负载,如电阻、电容、电感等。通过调整电子负载的参数,可以实现对电源输出电压、电流、功率等性能指标的精确控制。可编程电子负载广泛应用于电源测试、电池充放电…

基于vue+node.js智慧校园学生办证系统

基于vuenode.js智慧校园学生办证系统 摘要:随着计算机技术和网络技术的飞快发展,它加速了国内信息化建设的进程,信息技术对管理改革产生了深远的影响。为了适应新时代的发展趋势,各行各业都高度重视信息化建设。在教育领域&#…

成为Java开发高手:掌握Spring框架的关键技能-DI

DI相关内容 1.1 setter注入1.1.2 注入引用数据类型1.1.3 注入简单数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序 1.2 构造器注入1.2.2 构造器注入引用数据类型步骤1:删除setter方法并提供构造方法步骤2:配置文件中进行配置构造方式注入步…

4.9 构建onnx结构模型-Equal

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Equal 结点进行分析 方式 方法一…

北京华联BHGMall“宠粉模式”不断迭代,强体验注互动成行业UP主

在今年双11热度遇冷后,双十二被官宣取消,而这背后本质已经间接印证:传统“电商大促”的模式,已经难以为继。反观线下消费市场,则是以持续恢复和增长成为经济恢复的亮点,从线下客流量的快速回升,…

软考2016年上半年第六题(适配器模式)与手术训练系统项目适配器模式的应用

软考2016年上半年第六题 public class Address {public void street(){System.out.println("a");};public void zip(){};public void city(){}; }package org.example.适配器模式;/*** 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间…

整数和浮点数在内存中的存储​(大小端详解)

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1为什么有大小端?​ 2.2请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)-百度笔试题 方法一(char*强制类型转换&#xff09…

疑难杂症 之 关闭模态窗口之后刷新父窗口

疑难杂症 之 关闭模态窗口之后刷新父窗口 1. 模态窗口 与 非模态窗口2. 弹出模态窗口2.1 实现效果2.2 实现代码2.2.1 刷新父窗口2.2.2 完整代码 2.3 参考 3. 其他刷新父窗口(模态窗口页面与父窗口不在同一页面)3.1 实现代码3.1.1 核心代码3.1.2 多层模态…

什么是Amazon Lambda(无服务器计算服务)

Lambda 在高可用性计算基础设施上运行代码,用于执行计算资源的所有管理工作。这包括服务器和操作系统维护、容量调配和弹性伸缩、代码和安全补丁部署以及代码监控和日志记录。您只需要提供代码。 最近亚马逊云服务提供了超多免费的云服务,快来领取免费套…

java版微信小程序商城免费搭建 java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

利用 FormData 实现文件上传、监控网路速度和上传进度(前端原生,后端 koa)

利用 FormData 实现文件上传 基础功能:上传文件 演示如下: 概括流程: 前端:把文件数据获取并 append 到 FormData 对象中后端:通过 ctx.request.files 对象拿到二进制数据,获得 node 暂存的文件路径 前端…

学习Opencv(蝴蝶书/C++)——4.图形和大型数组类型(上)

文章目录 1. cv::Mat类的成员变量1.1 flags1.2 cv::Mat::step2 存储方式,存储位置计算2.1 存储方式2.2 🌈存储位置计算2.2.1 基本计算公式2.2.1 step代码说明2.2.3 内存地址计算代码说明3 创建数据3.0 Mat的构成3.0.1 3.0版本之后的Mat3.0.2 cvMat3.1 构造函数3.2 🌈构造函…

【MySQL】MySQL数据库基础

MySQL数据库基础 一、为什么要有数据库?二、 数据库软件的构成数据库服务器,数据库,表关系主流数据库 三、基本使用1、连接服务器2、服务器管理3、MySQL配置文件4、数据库的简单操作5、数据逻辑存储 四、MySQL架构SQL分类MySQL客户端存储引擎…

Hadoop学习笔记(HDP)-Part.10 创建集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后,各大平台软件常常会邀请用户在口味,配送速度等多个方面给与评分。在 element-ui 组件中,已经有相应的 Rate 组件,但是已有组件…

vue3 vue-router过渡动效 滚动行为 (四)

文章目录 一、过渡动效1.1安装animate.css1.2 利用元信息存储过渡名称1.3 在组件中使用 二、滚动行为2.1 始终滚动到顶部2.2 相对于某个元素的偏移量2.3 保持之前的滚动位置 一、过渡动效 1.1安装animate.css npm install animate.css --save1.2 利用元信息存储过渡名称 {pa…

编译原理:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话,请记得给一个免费的赞哦(收藏也不错)! 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

微信视频无法播放,快速进行格式转换方法

你是否遇到过这样的事情呢,朋友或者家人在电脑上用微信给你发的视频,在自己的微信上点开却无法播放。这种是什么原因造成的呢?是不是需要将这些无法播放的视频转换为微信支持的格式才行,那应该如何转换呢? 不要着急&a…