原型模式: 原型模式可以理解为,以某一个对象为原型,生成一个新的毫无关联,但是初始化数值一致的全新对象。
看一下关系图
几个需要深拷贝的对象以及内嵌对象后面是通过序列化的形式作为解决方案所以需要实现序列化接口。
Monkey.class 作为统一的父类,拥有两个基本类型: 年龄、名称和一个引用类型:生日
在浅拷贝中,引动对象会使用相同的内存地址中的对象,而深拷贝是完全隔离开来的,本次只介绍深拷贝。
Monkey.class
最终也是通过序列化转为字节码所以也需要实现序列化接口
GoldenHoop.class
金箍棒类,设置一个属性为金箍棒的名称并且实现序列化。
MonkeyKing.class
猴子王,也属于猴子,所以继承Monkey,并且实现Clone以及序列化接口。
孙悟空有拔猴毛可以有多个分身,而每一个分身都有一个金箍棒,如果共用一个金箍棒,这个要变大,那个要变小,岂不乱套了。所以,每一个孙悟空都有一个金箍棒的属性。
每一个孙悟空在初始化的时候都会创建一个金箍棒,和一个产生时间。这个就放在构造器中,相当于出生。
deepClone()
深拷贝实现方法,创建一个克隆对象在最外层,作用域问题。
创建一个字节码输出流,将当前对象输出出去,这个并且没有写入到磁盘,而是写在缓存也就是内存中,进行刷新和资源释放。
创建一个输入流,将之前输出的对象写入进来,去调用readObject()
通过底层调用对象中的readResolve()
方法去实现实例化出一个全新的对象,这个对象是通过当前对象转为字节码的形式,创建对象,而和其它对象没有任何关联性,所以创建出来一个一摸一样,但是又没有任何关系的对象。
看一下最终测试代码:
我这边直接用注解把异常忽略了,方便观察。
首先有一个主体,这个主体就是孙悟空,new 进行一个初始化。
而每一个孙悟空都有一个金箍棒,给原版孙悟空金箍棒设置一个名称叫,主体金箍棒。
之后对原版孙悟空进行一个克隆,创造出一个克隆孙悟空,因为金箍棒是一个对象引用,可以进行一个对比测试,如果是浅引用,那么这两个对象的地址绝对是一样的。但是通过控制台发现不一样。
之后修改克隆孙悟空的金箍棒名称 克隆金箍棒
打印原版本金箍棒的名称和克隆金箍棒的名称。
可以再测试一下是否完全克隆,只需要在克隆孙悟空的金箍棒修改名字之前再打印一下克隆金箍棒的名称。
有点懒= =直接截大图了= =
可以看到,在修改之前金箍棒的名称也是复制过来的,可以说在创造出一个单独的个体初,数据是完全一致的。
理解完毕= =