原型模式——之浅复制与深复制

我对原型模式的理解就是,你现在有一个对象,我要得到另一个跟你一模一样的对象,我要就完事了,中间的细节不关我的事

说到原型模式,就必须了解下 浅复制与深复制 的概念

浅复制与深复制都是原型模式实现的方式

浅复制:复制时对象中的成员为基本类型的复制值,引用类型的复制地址

浅复制:复制时对象中的成员为基本类型的复制值,引用类型的复制一个一模一样的空间

下面以简历的复印举例

有简历类与工作经验类

简历包含姓名,年龄与工作经验三个成员

工作经验包含工作时间段与工作的公司

如下:记得实现cloneable接口

原型模式——之浅复制与深复制

原型模式——之浅复制与深复制

 

然后测试

由下图很明显,复制后的对象的地址值跟原来的不一样,说明是两个对象

原型模式——之浅复制与深复制

面打印了本体与克隆体的成员,发现名字与工作经历都复制过来了原型模式——之浅复制与深复制

可是,继续往下看

当修本体的工作经历的公司名称时,发现克隆体的也随之改变

原型模式——之浅复制与深复制

说明:这种复制就是浅复制,如果是成员是原始类型则会克隆值,但如果是对象则会克隆对象的地址

也就好像是复印的简历上工作经验部分写的是: 简历一

 

深复制实现:深复制就是当我复制后,我们就是两个完全独立的个体,就像拿一张简历再去复印一张,然后第二张上面修改信息,第一张没影响

怎样实现呢?

可能有人在spring配置文件中看到过 “prototype”,spring就是通过反射进行深复制的

对反射熟悉的话,实现很简单

然后就是序列化,这里我以序列化举例来实现深复制

修改Resume类中的clone方法,使之从浅复制变为深复制

原型模式——之浅复制与深复制

说明:先创建一个字节数组输出流,将this也就是当前对象保存在里面,然后再用输入流读出来

 

测试:当我修改本体简历工作经验中公司名时,克隆体不受影响

原型模式——之浅复制与深复制

效果如上图,实现了深复制,也就是我复印了一份简历

如果能看到这里也是真不容易了,老铁

欢迎提问,欢迎纠错,可以转载,但请注明本文链接