我对原型模式的理解就是,你现在有一个对象,我要得到另一个跟你一模一样的对象,我要就完事了,中间的细节不关我的事
而说到原型模式,就必须了解下 浅复制与深复制 的概念了
浅复制与深复制都是原型模式实现的方式
浅复制:复制时对象中的成员为基本类型的复制值,引用类型的复制地址
浅复制:复制时对象中的成员为基本类型的复制值,引用类型的复制一个一模一样的空间
下面以简历的复印举例
有简历类与工作经验类 |
简历包含姓名,年龄与工作经验三个成员 |
工作经验包含工作时间段与工作的公司 |
如下:记得实现cloneable接口
然后测试
由下图很明显,复制后的对象的地址值跟原来的不一样,说明是两个对象
下面打印了本体与克隆体的成员,发现名字与工作经历都复制过来了
可是,继续往下看
当修本体的工作经历的公司名称时,发现克隆体的也随之改变
说明:这种复制就是浅复制,如果是成员是原始类型则会克隆值,但如果是对象则会克隆对象的地址
也就好像是我复印的简历上工作经验部分写的是: 同简历一
深复制实现:深复制就是当我复制后,我们就是两个完全独立的个体,就像拿一张简历再去复印一张,然后第二张上面修改信息,第一张没影响
怎样实现呢?
可能有人在spring配置文件中看到过 “prototype”,spring就是通过反射进行深复制的
对反射熟悉的话,实现很简单
然后就是序列化,这里我以序列化举例来实现深复制
修改Resume类中的clone方法,使之从浅复制变为深复制
说明:先创建一个字节数组输出流,将this也就是当前对象保存在里面,然后再用输入流读出来
测试:当我修改本体简历工作经验中公司名时,克隆体不受影响
效果如上图,实现了深复制,也就是我复印了一份简历
如果能看到这里也是真不容易了,老铁
欢迎提问,欢迎纠错,可以转载,但请注明本文链接