上一篇文章针对原型模式的介绍中,介绍了两种原型模式的实现方式:浅拷贝和深拷贝。
看一张图,简单回顾一下深拷贝和浅拷贝的区别,如图:
浅拷贝:除了基本数据类型之外,所有非基本数据类型对象都不进行复制,所有值指向的同一个地址空间
深拷贝:复制所有类型值。
在上一篇提到的两种实现原型模式的模板都有一个共同点,都需要实现 Cloneable
接口 同时重写 clone()
方法,在实际开发中,这是不切实际的,所以需要另外的方式来实现原型模式,也就是对象的复制。
一、实现一个简单对象复制工具类
反射实现浅拷贝
相关代码如下
反射实现深拷贝
反射同样可以实现深拷贝,有兴趣可以自行实现,这里可以直接使用 序列化和反序列化来进行深拷贝,因为反序列化本质就是使用反射机制来实现的。
相关工具类代码如下
不过该方式需要注意,原型对象需要实现 Serializable
接口
二、第三方的复制工具类
在开发中,存在很多已经写好的工具类,比如 springframework 的 BeanUtils
,该工具类实现的浅克隆,简单的复制代码使用API如下:
BeanUtils.copyProperties(father,copy);
在项目中原型的使用场景通常是用来进行 VO,DTO 等实体对象的转换,基本上浅克隆就够了。
如果真的需要深克隆,可以直接使用序列化反序列化完成即可。
【公众号】花好夜猿