java设计模式Ctrl C和Ctrl V的原型模式详解

 更新时间:2023年02月08日 08:52:15   作者:OpenGL  
这篇文章主要为大家介绍了java设计模式Ctrl C和Ctrl V的原型模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

记个笔记

早会,你拿着电脑在会议室里新建了一个记事本,用着搜狗输入法,疯狂的记录着你们部门老大的各种会议纪要。

时间很快,等散会的时候已经中午了,此时阿良才着急忙慌的赶到。看着他手足无措的样子,你淡定的对他说,不要急,会议内容都被你记录下来了,等会拷贝给他一份就好了。听完你的话,他忐忑的心才慢慢放下。

我们日常生活使用电脑时,经常会用到的一个操作,就是复制粘贴,即 Ctrl+C和Ctrl+V。但是编程中,我们创建了一个对象,想在使用时拷贝出来一份该怎么办呢。这就是今天想提到的设计模式,原型模式。

原型模式定义

以目标对象为原型实例,通过复制的方式创建新对象。

其实换成人话就是:在内存复制一个内容一模一样新的对象

使用的时机:

创建对象时,在构造函数中会进行大量的资源消耗操作。举几个比较夸张的例子:比如说可能进行网络申请或者说拷贝个几百m的数据到本地,再或者说要检查下本地内存卡或者电脑硬盘上有多少个文件夹。这些都是很耗时的计算,但是这些都是在创建该对象之前的准备工作(举例而已,可能有点夸张)。此时可以使用原型模式,直接在内存中复制一个一模一样的对象。

拷贝的区别

官方抽象的描述

  • 浅拷贝:基本数据类型互不干扰,两个引用数据类型引用,指向内存中同一个对象。
  • 深拷贝:在内存中生成一个内容一模一样的引用数据对象。原型对象和生成对象互不干扰。

好理解的人话

  • 浅拷贝:你在我的电脑中,创建了一个C盘的快捷方式。快捷方式和我的电脑中的C盘都能打开C盘文件夹。
  • 深拷贝:你把你的会议时创建的记录会议的记事本,拷贝了一份给你的好友阿良。这两个记事本中的数据互不干扰。

使用的步骤:

1. 继承实现Clone接口

2. 对象内部的基本数据类型变量,会直接拷贝。

3. 引用数据类型,可以根据需求。自行实现深拷贝或者浅拷贝(默认即浅拷贝,类比成快捷方式)

实现代码

/**
 * @author:TianLong
 * @date:2022/10/18 19:47
 * @detail:原型模式 具体实现类
 */
class Book implements Cloneable{
    public ArrayList<String> articles = new ArrayList<>();
    public String author = "";
    public int price = 0;
    public String publishers = "";
    public Book(ArrayList<String> articles, String author, int price, String publishers) {
        this.articles = articles;
        this.author = author;
        this.price = price;
        this.publishers = publishers;
    }
    @Override
    public Book clone() {
        Book book = null;
        try {
          book = (Book) super.clone();
          // 引用数据类型,需实现深拷贝
          book.articles = (ArrayList<String>) this.articles.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
        return book;
    }
    @Override
    public String toString() {
        return "Book{" +
                "articles=" + articles +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", publishers='" + publishers + '\'' +
                '}';
    }
}
/**
 * @author:TianLong
 * @date:2022/10/18 19:52
 * @detail:客户端
 */
class Client {
    public static void main(String[] args) {
        ArrayList<String>arrayList=new ArrayList<>();
        arrayList.add("丑小鸭");
        arrayList.add("白雪公主");
        arrayList.add("小红帽");
        Book book = new Book(arrayList,"安徒生",20,"人民出版社");
        Book cloneBook = book.clone();
        // 引用数据类型
        book.articles.add("大闹天宫");
        // 数据输出
        System.out.println(book.toString());
        System.out.println(cloneBook.toString());
    }
}

原型模式的优缺点

  • 优点:在内存中以二进制流的方式直接拷贝对象数据。不需要new对象。
  • 缺点:clone创建对象时,不会执行构造器函数。既是优点也是缺点。如需要实现某些放在构造器函数内的操作时,需要注意。

几个注意事项

  • 原型模式,只要能达到复制对象目的即可,不一定需要实现clone接口。
  • 实现clone接口后,调用对象的clone方法时,基本数据类型直接复制,引用数据类型只拷贝了对象引用。
  • 若要实现引用数据类型的深拷贝,要么该引用数据类型自己内部实现了clone接口,要么直接new该对象,将原有数据添加到new出来的对象中。手动进行数据拷贝。
  • clone接口复制时,参数内容以二进制流的方式在内存中直接复制,不执行对象的构造方法

后记

原型模式就像是在Ctrl+C和Ctrl+V一样。可以帮我们快速的在内存中创建出一个对象。唯一要注意的是,拷贝出来的数据是 ”快捷方式“ ,还是一个 ”单独的文件“

以上就是java设计模式 Ctrl C和Ctrl V---原型模式的详细内容,更多关于java设计模式 Ctrl C Ctrl V-的资料请关注脚本之家其它相关文章!

相关文章

  • javaweb设计中filter粗粒度权限控制代码示例

    javaweb设计中filter粗粒度权限控制代码示例

    这篇文章主要介绍了javaweb设计中filter粗粒度权限控制代码示例,小编觉得还是挺不错的,需要的朋友可以参考。
    2017-10-10
  • 使用spring-task定时任务动态配置修改执行时间

    使用spring-task定时任务动态配置修改执行时间

    这篇文章主要介绍了使用spring-task定时任务动态配置修改执行时间,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中成员方法与成员变量访问权限详解

    Java中成员方法与成员变量访问权限详解

    在Java学习过程中,在写类经常为用到public,private和protected,我个人的经验是一般类的成员变量都是用private,方法用public,类的内部用protected方法,如果是存在子类的,那我就会把父类中的成员变量变为protected。(其余的看具体实际情 况而定)
    2015-08-08
  • 学好Java MyBatis拦截器,提高工作效率

    学好Java MyBatis拦截器,提高工作效率

    这篇文章主要介绍了Java中的 MyBatis拦截器,  Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。详细内容需要的小伙伴可以参考下面文章内容,希望对你有所帮助
    2022-02-02
  • Java将json字符串转换为数组的几种方法

    Java将json字符串转换为数组的几种方法

    在Java开发中,经常会遇到将json字符串转换为数组的需求,本文主要介绍了Java将json字符串转换为数组的几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot 多环境打包最佳实践记录

    SpringBoot 多环境打包最佳实践记录

    SpringBoot通过配置多环境文件和在打包时指定激活的环境,实现多环境打包与部署,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • spring mvc DispatcherServlet之前端控制器架构详解

    spring mvc DispatcherServlet之前端控制器架构详解

    这篇文章主要为大家详细介绍了spring mvc DispatcherServlet之前端控制器架构,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • SpringMVC JSON数据交互实现过程解析

    SpringMVC JSON数据交互实现过程解析

    这篇文章主要介绍了SpringMVC JSON数据交互实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • dm.jdbc.driver.DMException网络通信异常的解决过程

    dm.jdbc.driver.DMException网络通信异常的解决过程

    最近一个项目里面出现了一个比较诡异的问题,给大家分享下,这篇文章主要给大家介绍了关于dm.jdbc.driver.DMException网络通信异常的解决过程,需要的朋友可以参考下
    2023-02-02
  • Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中Stream使用过程中的一个注意事项,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11

最新评论