一 概念:

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

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

 

二 示例

2.1 浅克隆

人 实体类

java设计模式-原形模式 随笔 第1张                                  

 

 医生类,重写clone方法

java设计模式-原形模式 随笔 第2张

 

浅克隆测试方法

java设计模式-原形模式 随笔 第3张

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

 

2.2 普通的深度克隆

人 实体类 继承Cloneable接口

java设计模式-原形模式 随笔 第4张

 

医生类,重写clone()方法

java设计模式-原形模式 随笔 第5张

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

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

 

测试方法

java设计模式-原形模式 随笔 第6张

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

 

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

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

java设计模式-原形模式 随笔 第7张

 

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

java设计模式-原形模式 随笔 第8张

 

测试方法

 java设计模式-原形模式 随笔 第9张

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

 

总结:

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

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

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄