一、原型模式介绍

原型模式(Prototype Design Pattern)就是以一个对象实例为原型,然后拷贝复制生成新的对象实例。
在开发中,通过 DTO,VO 等来区分不同用途的对象,而这些大部分字段基本上都是相同的。如果每一次对象的构建都是通过 set 方法一个个字段的设置操作,开发效率低,步骤繁琐。这时候就可以使用原型模式进行对象实例的复制,从而解放生产力。
原型模式从复制的深度可以分为两种:浅拷贝深拷贝

二、原型设计模型(使用套路)

2.1、浅拷贝代码模板

浅拷贝的原型复制,复制的对象,只能复制基本类型的属性,对于非基本类型属性,复制的新对象和原来的对象所指向的内存地址不变。

模板案例如下

[设计模式]-[创建型]-原型-介绍 - 图1
以上允许被复制的对象原型需要如下操作:
1、实现 Cloneable 接口
2、重写 clone() 方法

测试代码如下

[设计模式]-[创建型]-原型-介绍 - 图2

通过嵌套组装,祖孙三代的对象数据,然后通过浅拷贝的方式,克隆出新的祖孙三代的数据

代码运行结果如下

[设计模式]-[创建型]-原型-介绍 - 图3

代码 debug 对象地址,如下图

[设计模式]-[创建型]-原型-介绍 - 图4

通过运行时的对象地址,和代码运行结果,能够得出浅拷贝原型复制,在复制对象的时候会创建新的对象,但是内部的所有非基本属性对象并没有复制,这些对象值指向的都是同一个地址空间。
以上案例,浅拷贝复制地址关系对应的逻辑图如下:
[设计模式]-[创建型]-原型-介绍 - 图5

2.2、深拷贝代码模板

深拷贝原型复制,复制的新对象,包括非基本类型属性的所有属性都会进行复制,所有属性不在指向原有地址空间。

使用序列化反序列的方式来实现深拷贝。

模板案例如下:

[设计模式]-[创建型]-原型-介绍 - 图6

以上允许被复制的对象原型需要如下操作:
1、实现 Cloneable 接口 和 Serializable 接口
2、重写 clone() 方法
3、在 clone() 中实现序列化和反序列化操作

测试代码如下

[设计模式]-[创建型]-原型-介绍 - 图7

通过嵌套组装,祖孙三代的对象数据,然后通过深拷贝的方式,克隆出新的祖孙三代的数据

代码运行结果如下

[设计模式]-[创建型]-原型-介绍 - 图8

代码 debug 对象地址,如下图

[设计模式]-[创建型]-原型-介绍 - 图9
通过运行时的对象地址,和代码运行结果,能够知道深拷贝复制原型对象的所有数据,并开辟新的地址空间存放。复制前后的地址逻辑图如下:
[设计模式]-[创建型]-原型-介绍 - 图10


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