• java设计模式-原形模式


    一 概念:

    以一个对象为原型,对其进行复制(克隆),产生一个和原对象类似的新对象,通过clone()实现。克隆可分为浅克隆深克隆

    1 浅复制(浅克隆)
    复制出的新对象所有变量与原来对象有相同的值,而对其他对象的引用,任然指向原对象。Object 提供的clone()方法只是拷贝本对象,引用对象等都不管,还是指向原对象。

    2 深复制(深克隆)
    复制出的新对象的所有编码都含有与原对象相同的值,除了那些引用其他对象的变量,引用其他对象的变量,将指向被复制过的新对象,不再是原有的引用对象。

    二 示例

    2.1 浅克隆

    人 实体类

                                      

     医生类,重写clone方法

    浅克隆测试方法

    可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字也改变了。说明doctor2引用的person还是doctor 引用的person。

    2.2 普通的深度克隆

    人 实体类 继承Cloneable接口

    医生类,重写clone()方法

    可以看到clone()方法内,第一行是浅克隆医生,但此时医生所引用的person并没有被克隆,第二行代码才是克隆了person,

    doctor本身和被它引用的对象都被浅克隆了,所以实现了深克隆。

    测试方法

    可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字并没有改变。说明doctor2引用的person不是doctor 引用的person。

    2.3 使用二进制流序列化 深度克隆

    人 实体类,继承序列化接口

    使用二进制流序列化,深度克隆

    测试方法

     

    可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字并没有改变。说明doctor2引用的person不是doctor 引用的person。

    总结:

    普通的深度克隆,其实是多个浅克隆组合在一起,把当前对象浅克隆,把所有被引用的对象也都浅克隆,就实现了深克隆。

    而使用二进制流序列化的方式深克隆,就比较彻底,继续了序列化接口的类,都可以被深度克隆。

  • 相关阅读:
    异常
    JAVA Math类
    Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
    JAVA之JDBC数据库连接池总结篇
    利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等
    python3 最基本且简单的实现组合设计模式
    原生工程接入Flutter实现混编
    a[i][j] 和 a[j][i] 有什么区别?
    iconv函数报错 Detected an illegal character in input string
    用Python把20年的GDP、人口以及房价数据进行了可视化
  • 原文地址:https://www.cnblogs.com/hup666/p/10679015.html
Copyright © 2020-2023  润新知