- 该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象,用这种方式创建对象非常高效。
- JAVA提供了对象的 clone() 方法,需要实现Clonable接口并重写Object类中的clone方法
- 在JVM中,只有实现了Clonable接口的类才可以拷贝,否则会抛CloneNotSupportedException异常
- 原型模式不会调用类的构造方法,特别注意原型模式不可以和单例模式一起使用
public abstract class WeeklyLog implements Cloneable, Serializable {
protected Attachment attachment;
protected String name;
public abstract Attachment getAttachment();
public abstract void setAttachment(Attachment attachment);
public abstract String getName();
public abstract void setName(String name);
//实现浅拷贝
public abstract WeeklyLog shadowClone();
//实现深拷贝
public abstract WeeklyLog deepClone() throws IOException, ClassNotFoundException;
}
public class MyWeeklyLog extends WeeklyLog {
//实现浅拷贝
public WeeklyLog shadowClone() {
Object obj = null;
try{
return (WeeklyLog) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("不支持复制");
return null;
}
}
// 实现深拷贝
public WeeklyLog deepClone() throws IOException, ClassNotFoundException {
//todo:将对象写入流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
//todo:将对象从流中读出
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (WeeklyLog)ois.readObject();
}
}
原型模式总结
- 浅拷贝:只会拷贝对象的基本数据类型以及对应的封装类型和值类型的String类型,不会拷贝数组,容器对象,引用对象等.而引用类型,指向的还是原对象所指向的对象,这就是浅拷贝
- 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
- 原型模式本省比较简单,易于实现.主要是重写Object中的clone() 方法,根据要求实现浅拷贝或者是深拷贝
- 使用原型模式创建对象比直接使用new创建对象的性能要好: 因为Object中的clone() 方法是一个本地native方法,直接操作内存中的二进制流.尤其在拷贝大对象时,性能提升明显
- 实现深拷贝较为复杂,而且当对象之间存在多重嵌套时,为了实现深拷贝,需要每一层对象对应的类都必须支持深拷贝,实现比较复杂