原型模式
原型模式非常好理解和简单,所以在很多场景中也经常使用,其定义如下:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
通俗的讲就是不使用new方法来生成一个新的对象,来实现对象的实例化操作。
模式组成
这个类图非常简单,其核型就是一个clone()方法,通过该方法完成对对象的拷贝,在java中提供一个Cloneable接口来标示这个对象是可拷贝的,这个接口没有方法,只是其起一个标记作用,在JVM中具有这个标记的对象有可能被拷贝。
import java.util.ArrayList;
public class PrototypeClass implements Cloneable {
private ArrayList<String> list = new ArrayList<String>();
public PrototypeClass() {
// TODO Auto-generated constructor stub
System.out.println("构造函数被执行。。。");
}
public PrototypeClass clone() {
PrototypeClass pro = null;
try {
pro = (PrototypeClass)super.clone();
this.list = (ArrayList<String>)this.list.clone(); //深拷贝
} catch(Exception e) {
System.out.println(e);
}
return pro;
}
public void setValue(String value) {
this.list.add(value);
}
public ArrayList<String> getValue() {
return this.list;
}
}
测试类:
public class Client {
public static void main(String[] args) {
PrototypeClass pro = new PrototypeClass();
pro.setValue("张三");
PrototypeClass pro2 = pro.clone();
pro2.setValue("李四");
System.out.println(pro.getValue());
}
}
原型模式的总结
- 性能优良:原型模式是在内存二进制流的拷贝,比直接new的性能要高
- 逃避构造函数的约束:直接在内存中拷贝,构造函数不会执行
使用场景
- 资源优化场景
- 性能和安全要求场景
- 一个对象多个修改者的场景
注意事项
- 构造函数不会执行
- 浅拷贝和深拷贝问题