上一篇文章针对原型模式的介绍中,介绍了两种原型模式的实现方式:浅拷贝和深拷贝。
看一张图,简单回顾一下深拷贝和浅拷贝的区别,如图:

[设计模式]-[创建型]-原型-谈谈对象复制 - 图1

浅拷贝:除了基本数据类型之外,所有非基本数据类型对象都不进行复制,所有值指向的同一个地址空间

深拷贝:复制所有类型值。

在上一篇提到的两种实现原型模式的模板都有一个共同点都需要实现 Cloneable 接口 同时重写 clone() 方法,在实际开发中,这是不切实际的,所以需要另外的方式来实现原型模式,也就是对象的复制。

一、实现一个简单对象复制工具类

反射实现浅拷贝

相关代码如下

[设计模式]-[创建型]-原型-谈谈对象复制 - 图2

反射实现深拷贝

反射同样可以实现深拷贝,有兴趣可以自行实现,这里可以直接使用 序列化和反序列化来进行深拷贝,因为反序列化本质就是使用反射机制来实现的。

相关工具类代码如下

[设计模式]-[创建型]-原型-谈谈对象复制 - 图3

不过该方式需要注意,原型对象需要实现 Serializable 接口

二、第三方的复制工具类

在开发中,存在很多已经写好的工具类,比如 springframework 的 BeanUtils ,该工具类实现的浅克隆,简单的复制代码使用API如下:

  1. BeanUtils.copyProperties(father,copy);

在项目中原型的使用场景通常是用来进行 VO,DTO 等实体对象的转换,基本上浅克隆就够了。

如果真的需要深克隆,可以直接使用序列化反序列化完成即可。


【公众号】花好夜猿
wxlogo.jpg