目录
深克隆(deep clone)和浅克隆(shallow clone)的区别
原型模式介绍
原型模式是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,调用者不需要知道任何创建细节,不调用构造函数。
适用场景:
1.类初始化消耗资源较多
2.new产生的一个对象需要非常繁琐的过程(数据准备,访问权限等)
3.构造函数比较复杂。
4.循环体重生产大量的对象时。
原型模式的使用
创建一个Prototype类,其中有私有成员变量name,age,hobbies,实现Cloneable接口重写clone方法。
@Data
public class Prototype implements Cloneable{
private String name;
private Integer age;
private List<String> hobbies;
@Override
protected Object clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
调用clone方法克隆一个Prototype对象,判断是否是同一个引用,判断hobbies是否是同一个引用
public class Client {
public static void main(String[] args){
Prototype prototype = new Prototype();
prototype.setName("张三");
prototype.setAge(19);
List hobbies = new ArrayList<>();
hobbies.add("看书");
hobbies.add("写字");
hobbies.add("画画");
prototype.setHobbies(hobbies);
Prototype prototype1 = (Prototype) prototype.clone();
System.out.println(prototype==prototype1);
System.out.println(prototype.getHobbies()==prototype1.getHobbies());
}
}
结果显示Prototype不是同一引用,但是hobbies却是同一个,这说明Cloneable默认的clone方法只是浅拷贝。
false
true
实现Cloneable接口默认的clone方法只是浅克隆,对于引用对象克隆的是对象的地址,如果修改克隆对象的引用属性会导致原型对象数据也会被修改
深克隆(deep clone)和浅克隆(shallow clone)的区别
1.数据拷贝后两者之间是否有关联
2.改变一个值是否会影响另一个数值变化
浅克隆常用的API
1.工具类BeanUtils和PropertyUtils进行对象复制
spring的BeanUtils(copyProperty和copyProperties方法)
commons的BeanUtils(copyProperties方法)
2.实现Clonenable接口
3.Arrays.copyOf(),但在ArrayList中实现了深克隆的效果(重写了clone方法)
深克隆常用的API
1.每个对象都要实现Clonenable接口并重写Object类中的clone方法
2.序列化,必须实现Serializable接口
3.Apache Commons工具包SerializationUtils.clone()
4.通过Json工具类实现深克隆
5.通过构造方法实现深克隆(手动new对象)
原型模式的优点
性能优良,java自带的原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了许多。
可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建
过程。
原型模式的缺点
必须配备克隆(或者可拷贝)方法
当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
深拷贝,浅拷贝需要运用得当。
原型模式在Spring中的应用
在 Spring 中原型 bean 的创建,就是使用得原型设计模式
比如我们在配置 Spring 的 bean 的时候,Spring 的 bean 默认是单例,有这么个标签scope="prototype", 设置为prototype则是原型的