设计模式就该这样学:基于经典框架源码和真实业务场景
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

9.3 原型模式在框架源码中的应用

9.3.1 原型模式在JDK源码中的应用

首先定义JDK中的Cloneable接口。

img

定义接口还是很简单的,我们找源码其实只需要看哪些接口实现了Cloneable即可。来看ArrayList类的实现。

img

我们发现,clone()方法只是将List中的元素循环遍历了一遍。此时,再思考一下,是不是这种形式就是深克隆呢?其实用代码验证一下就知道了,继续修改ConcretePrototype类,增加一个deepCloneHobbies()方法。

img

客户端代码修改如下。

img

运行代码也能得到期望的结果。但是这样的代码其实是硬编码。如果在对象中声明了各种集合类型,则每种情况都需要单独处理。因此,深克隆的写法一般会直接用序列化来操作。

9.3.2 原型模式在Spring源码中的应用

在Spring中,如果用户将创建对象的方式设置为原型,则每次调用getBean()的时候都要重新创建一个新的对象返回。和单例模式一样,还是继续来看doGetBean()方法的代码片段。

img
img

Spring中创建对象的方式默认采用单例模式,可以通过设置@Scope(“prototype”)注解将其改为原型模式。但是,采用单例模式创建或者采用原型模式创建,只能二选一。