定义:是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 。
调用者不需要知道任何创建细节,不调用构造函数。
适用场景:
- 类初始化消耗资源较多
- New产生的一个对象需要非常繁琐的过程 (数据准备,访问权限等)
- 构造函数比较复杂
例如:Dto转换成Vo的过程中,需要通过set方法进行大量的操作,这个时候我们可以使用原型模式
我们用的BeanUtils,JSON.parseObject()、Guava等工具类都是使用原型模式,以及Spring的Score属性
score = "prototype";
score = "singleton";
接下来介绍原型模式的使用方式:
深克隆:将对象的属性不仅仅拷贝值,而是将重新常见对象,重新赋值。例如Arrays.copy() 方法 。
深度克隆通过字节码方式构造出一个新的对象(实例)
浅克隆:仅仅拷贝值,对个对象的属性引用指向同一个内存地址,不拷贝引用。
我们可以通过测试发现:
我们可以看出深度克隆不仅仅拷贝值,而是将重新常见对象,重新赋值。
当然原型模式也有它的缺点:
- 必须配备克隆(或者可拷贝)的方法
- 对克隆复杂对象或对克隆出的对象进行复杂改造时,易带来风险。
- 深拷贝、浅拷贝要运用的当。