一、原型模式的定义
原型模式的简单程度仅次于单例模式和迭代器模式。因为简单,所以使用的场景才比较多 :
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式的核心是一个 clone 方法,通过该方法来进行对象的拷贝,Java提供了一个Cloneable接口来标示这个对象是可拷贝的,当然有的对象是没有的如果我们想拷贝怎么办呢 ? 我们就只需要重写 clone 方法就可以啦!
二、原型模式的优点
1、性能优良
原型模式是在内存二进制流的拷贝,要比直接 new 一个对象性能好很多,特别是要在一个循环体内产生大量的对象,原型模式可以更好的体现其优点。
2、逃避构建函数的约束
它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的
优点 : 就是减少了约束
缺点 : 也是减少了约束
三、原型模式的使用场景
1、资源优化场景
类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
2、性能和安全要求的场景
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
3、一个对象多个修改者的场景
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
四、原型模式的注意事项
1、构造函数不会被执行
2、深拷贝和浅拷贝
深拷贝 : 对私有的类变量进行独立的拷贝
浅拷贝 : clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝
3、clone 和 final 两个关键字是有冲突的
代码 :
原型类
public class Prototype implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
}
一个复制的例子
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* 浅复制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* 深复制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 写入当前对象的二进制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 读出二进制流产生的新对象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public SerializableObject getObj() {
return obj;
}
public void setObj(SerializableObject obj) {
this.obj = obj;
}
}
class SerializableObject implements Serializable {
private static final long serialVersionUID = 1L;
}
通过以上的资料大家应该对原型模式有一个新的认识了吧 ! 有误的地方请指出 , 谢谢!