原型模式

为什么要使用原型模式

不用重新初始化对象,而是动态地获得对象运行时的状态。适用于当创建对象的成本较高时,如需进行复杂的数据库操作或复杂计算才能获得初始数据。

优点是可以隐藏对象创建的细节,减少重复的初始化代码;可以在运行时动态地增加和删除产品。

什么是原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通
过复制这些原型创建新的对象
在这里插入图片描述

"原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

组成

  1. Prototype(原型):
    • 定义一个包含克隆自身的方法的接口。在 Java 中,可以通过实现 Cloneable 接口来达到这个目的。
  2. Concrete Prototype(具体原型):
    • 实现或继承原型接口,并重写克隆方法。
  3. Client(客户端):
    • 创建一个新对象,通过复制原型实例来完成。

怎么使用

Java实现原型模式的步骤:

  1. 创建原型接口:
    • 在 Java 中,通常使用 Cloneable 接口作为原型。
  2. 实现具体的原型类:
    • 创建类,实现 Cloneable 接口。
    • 重写 clone() 方法,根据需要进行深拷贝或浅拷贝。
  3. 在客户端代码中复制对象:
    • 使用原型实例的 clone() 方法来获取对象的副本。

什么时候使用

一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高,

浅拷贝和深拷贝

  • 浅复制,被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
  • 深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象

浅拷贝

public class ShallowCopyExample implements Cloneable {
    private int[] data;

    public ShallowCopyExample() {
        data = new int[10];
        for (int i = 0; i < data.length; i++) {
            data[i] = i;
        }
    }

    public void setData(int index, int value) {
        data[index] = value;
    }

    public int[] getData() {
        return data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        ShallowCopyExample e1 = new ShallowCopyExample();
        ShallowCopyExample e2 = null;

        try {
            e2 = (ShallowCopyExample) e1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        e1.setData(0, 999);
        int[] e2Data = e2.getData();
        System.out.println("Shallow Copy Example: " + e2Data[0]); // 输出 999,因为是浅拷贝
    }
}

深拷贝

和上面浅拷贝不同的是重写 clone() 方法,在其中不仅调用 super.clone(),还要为所有的对象成员变量创建新的实例。

public class DeepCopyExample implements Cloneable {
    private int[] data;

    public DeepCopyExample() {
        data = new int[10];
        for (int i = 0; i < data.length; i++) {
            data[i] = i;
        }
    }

    public void setData(int index, int value) {
        data[index] = value;
    }

    public int[] getData() {
        return data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopyExample copy = (DeepCopyExample) super.clone();
        copy.data = data.clone(); // 复制数组,而不是引用
        return copy;
    }

    public static void main(String[] args) {
        DeepCopyExample e1 = new DeepCopyExample();
        DeepCopyExample e2 = null;

        try {
            e2 = (DeepCopyExample) e1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        e1.setData(0, 999);
        int[] e2Data = e2.getData();
        System.out.println("Deep Copy Example: " + e2Data[0]); // 输出 0,因为是深拷贝
    }
}

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

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

相关文章

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…

分布式数据库原理及技术题目汇总(上)

题目汇总 选择 1.(单选题,3.0分)以下说法中不正确的是&#xff08;B &#xff09;。 A.HIVE中create table命令使用时&#xff0c;表类型可以存储为ORC。 B.HIVE中create table命令使用时&#xff0c;必须包含row format delimited。 C.HIVE中create table命令使用时若含r…

儿童护眼台灯什么品牌好?儿童护眼台灯品牌排行

台灯大家都不陌生&#xff0c;但使用它的人有多少呢&#xff0c;准确使用的人又有多少呢&#xff0c;我们就是为了照明才会去买台灯&#xff0c;而时间久了&#xff0c;你就会眼睛刺痛&#xff0c;那就是没有选对台灯和没有正确使用台灯&#xff0c;还是建议大家买具有护眼功能…

首次落地零担快运!商用车自动驾驶跑出交付加速度

即将迈入2024年&#xff0c;还活着的自动驾驶玩家&#xff0c;身上有两个显著标签&#xff1a;选对了细分赛道、会玩。 10月以来&#xff0c;Cruise宣布在美国德州奥斯汀、休斯顿、亚利桑那州凤凰城和加州旧金山全面停止所有自动驾驶出租车队运营服务&#xff0c;通用汽车计划…

OSS 上传的操作

OSS 上传的操作&#xff1a; 依赖包&#xff1a; <!-- 阿里云OSS --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency> 配置文…

基于Java SSM框架实现音乐推荐网站项目【项目源码+论文说明】

基于java的SSM框架实现音乐推荐网站演示 摘要 中国风音乐推介网站近年来已成为风靡全球的新兴艺术形式。国内涌现出了大批优秀、有才华的爱好者和许多经久不衰的经典作品。中国风音乐推介网站的兴起打破了音乐界格局,也突破了原有分类唱法发展中的瓶颈,为声乐艺术的发展开辟了…

为啥领导都爱说“我只看结果”?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码

承接上文&#xff0c;之前已经分析过OpenFegin 的创建、发送请求源码了&#xff0c;接下来&#xff0c;分析下底层的HttpClient、HttpURLConnection、OkHttpClient切换从源码级别来看是如何做到的。 Spring Cloud OpenFegin&#xff08;创建、发送请求&#xff09;源码 Http…

创建mysql普通用户

一、创建mysql普通用户的原因&#xff1a; 权限控制&#xff1a;MySQL的权限系统允许您为每个用户分配特定的权限。通过创建普通用户&#xff0c;您可以根据需要为每个用户分配特定的数据库和表权限&#xff0c;而不是将所有权限授予一个全局管理员用户。这有助于提高数据库的…

浮动和定位

目录​​​​​​​ &#x1f333;浮动 &#x1f340;去浮动 &#x1f343;方法一 &#x1f343;方法二 &#x1f343;方法三 &#x1f333;定位 &#x1f340;相对定位 &#x1f340;绝对定位 &#x1f340;固定定位 &#x1f333;转义字符 浮动 浮动会脱离文档流.导…

部署vue项目的常见问题汇总--许锅锅

文章目录 vue项目的常见问题版本问题/控制台指令识别问题【node和npm的版本要对应】加载慢的问题【设置镜像即可】设置淘宝镜像cmd窗口内容 npm/cnpm install的问题 npm WARN deprecated core-js3.6.5: core-js&#xff1c;3.23.3 is no longer maintained and not recommended…

计算机毕业设计------SSH宿舍管理系统

项目介绍 本项目分为三种角色&#xff1a;系统管理员、楼宇管理员、学生&#xff1b; 系统管理员主要功能如下&#xff1a; 楼宇管理员管理、学生管理、楼宇管理、宿舍管理、学生入住登记、学生寝室调换、学生迁出登记、学生缺勤记录、修改密码、退出登录 楼宇管理员主要功能…

新接入荣耀 SDK,混淆出包,登录提示框显示不全

荣耀联运客户端 SDK 刚出来不就&#xff0c;看文档第一个对外版本也就是 2023 年 8 月&#xff0c;所以最近开始接入&#xff0c;中间也遇到了一些麻烦折腾了不少时间。 什么意思呢 正常的登录提示 UI 是这样的&#xff0c;能够完整的显示 UI 部分&#xff08;此前是通过定制…

计算机毕业设计-----SSH校园精品课程网前后台

项目介绍 本项目是很不错的一个校园精品课程网源码&#xff0c;前台和后台源码都有&#xff0c;分为管理员与学生两种角色&#xff1b; 前台功能&#xff1a;网站首页&#xff0c;校园新闻&#xff0c;课程中心&#xff0c;资源下载&#xff0c;互动交流&#xff0c;个人中心…

借助GPT理解 “ Android中 点击弹框外部 取消弹框”

在平常的开发工作中 或 阅读技术博客/书籍 时&#xff0c;难免会遇到我们不懂的知识点&#xff0c;网络上搜索的资料 需要有准确性&#xff0c;系统性&#xff0c;可实操性。 这样的资料查询很费时间且还不一定能找到&#xff0c;但是如果借助训练过的的gpt&#xff0c;就会省下…

视频转gif的在线转换怎么操作?告别繁琐,轻松搞定

视频转gif的在线转换怎么操作&#xff1f;在当今社交媒体盛行的时代&#xff0c;GIF动图已经成为了我们表达自我、分享生活的重要方式。但是&#xff0c;很多小伙伴可能还在为如何将心爱的视频片段转为GIF而烦恼。今天&#xff0c;我们就来一起学习如何将视频轻松转换为GIF的在…

09-责任链模式-C语言实现

责任链模式&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.&#xff08;使多个对象都有…

基于ssm文化遗产的保护与旅游开发论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

适合游泳的骨传导耳机,推荐四款高质量游泳耳机!

游泳是一项全身性的运动&#xff0c;对于锻炼身体和塑形都很有帮助&#xff0c;但是游泳的时候往往会因为水的阻力而感到动作笨拙&#xff0c;同时也会感到枯燥无味。而一款好的游泳耳机则能够让你在游泳的过程中享受音乐或者其他的音频内容&#xff0c;增加游泳的趣味性&#…

chrony 时间同步

一.chrony简介 chrony 的优势&#xff1a; ① 更快的同步&#xff0c;从而最大程度减少了时间和频率误差&#xff0c;对于并非全天 24 小时运行的虚拟计算机而言非常有用。 相对于NTP来说&#xff0c;chrony性能更好 NTP是网络时间协议(Network Time Protocol)&#xff0c;它…