原型模式
1.1概念
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。需要实现Cloneable接口,重写clone()方法。
//克隆过程内部的数组和引用对象不会拷贝,其他的原始基本类型和String类型会被拷贝。
//方法一:重写clone方法,将对象的所有属性都手动克隆一下。
//方法二:序列化和反序列化,涉及IO流,效率不高。
//克隆只是在堆内存进行操作,不会执行构造函数。
- 克隆对象不会调用构造方法
构造方法只在一开始我们创建原型的时候输出了,执行clone方法的时候是直接从内存中去获取数据的,在第一次创建对象的时候就会把数据在内存保留一份,克隆的时候直接调用就好了。 - 访问权限对原型模式无效
原理也很简单,我们是从内存中直接复制的,所以克隆起来也会直接无视,复制相应的内容就好了。
具体实例
Spring中依赖注入的默认对象为单例形式,@Scope(“prototype”)注解可以将其改变为原型模式。
改变底层(如service层)的对象为原型模式时,同时改变上层调用层(如controller层)的调用方式,原型模式才会生效。修改Autowired->Autowired+Qualifier或者修改Autowired->Resource。因为Autowired按照类型进行注入,当单例模式时只有一个对象实例就不会出现问题,但是当改为原型模式时,spring就不知道选择哪个实例了,可以通过加上Qualifier注解指定名字,也可以通过Resource注解指定名字。