目录
1.原型模式的概念
2.原型模式的结构图
3.练习实例
需要被复制的对象:
@Data
@AllArgsConstructor
public class Clone implements Cloneable{
private int age;
private Date birthday;
public Clone clone() throws CloneNotSupportedException {
Object clone = super.clone();
return (Clone)clone;
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Clone clone = new Clone("张三",18,new Date());
try {
Clone clone1 = clone.clone();
Clone clone2 = clone.clone();
System.out.println(clone1 == clone2);//false 说明生成两个对象
System.out.println(clone1.getBirthday() == clone2.getBirthday());//true 说明共用一个对象
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
如果一个对象实现了Cloneable接口且调用了clone()方法的话就会生成另外一个“一样”的自己,但是生成的对象其基本数据类型(8大基本数据类型和其对应的包装类)和原对象是两套,各自拥有各自的,但是其引用数据类型是共用的一套,意思其引用数据类型(类类型,接口类型,数组类型)的属性其实没有被克隆,这也就是浅克隆;
如果想实现深克隆可以这么做:
需要被复制的对象:
@Data
@AllArgsConstructor
public class Clone implements Cloneable, Serializable {
private char aChar;
private Date birthday;
public Clone clone() throws CloneNotSupportedException {
Object clone = super.clone();
Clone clone1 = (Clone) clone;
clone1.birthday =(Date) this.birthday.clone();
return (Clone)clone;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Clone clone = new Clone('c',new Date());
try {
Clone clone1 = clone.clone();
Clone clone2 = clone.clone();
System.out.println(clone1 == clone2);//false 说明生成两个对象
System.out.println(clone1.getBirthday() == clone2.getBirthday());//false 说明是两个对象
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
深克隆:把要复制的对象所引用的对象都复制了一遍。
如果想要使用克隆只需要使类实现cloneable接口
4.总结
使用场景:
1.当我们的类初始化需要避免消耗很多的资源时,就可以使用原型模式,因为我们的克隆不会执行构造方法,是从内存中获取数据,避免了初始化占有的时间和空间。
2.一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。