原型模式
文档查阅说明:
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象(实际上就是实现Cloneable接口,重写clone()方法)
使用场景:
● 资源优化场景
类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
● 性能和安全要求的场景
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
● 一个对象多个修改者的场景
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用
浅拷贝和深拷贝:
浅拷贝:Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,其他的原始类型比如int、long、char、string(当做是原始类型)等都会被拷贝。
注意: 使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用对象,而不是一个原始类型或不可变对象。
深拷贝:对私有的类变量进行独立的拷贝,如:thing.arrayList = (ArrayList<String>)this.arrayList.clone();
public abstract class Prototype implements Cloneable {
private String id;
public Prototype(String id) {
super();
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
public class ConCreatePrototype extends Prototype {
public ConCreatePrototype(String id) {
super(id);
}
}
public class Test {
public static void main(String[] args) {
ConCreatePrototype con = new ConCreatePrototype("I");
ConCreatePrototype clone = (ConCreatePrototype) con.clone();
System.out.println(clone.getId());
System.out.println(con == clone);
System.out.println(con.equals(clone));
}
}