1、介绍
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节
实现方式:
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
使用情况:
很多时候,创建对象的时候,只是在某些属性值上有区别,而大部分都很相似,该类的用户对于该类的对象是怎么创建的,对类的内部结构这些都不关心的情况,但是这样的对象的初始化相对来说比较复杂,而且需要耗费较长的时间或资源,这种情况下,我们可以考虑使用Prototype模式。
2、浅度克隆
浅度复制:对于对象中的其他对象的引用复制的其实就是对象的句柄,仍然是同一个对象。我们操作的仍然是同一个对象,改变其中一个对象,另外的对象也会随之发生改变。 这就是浅度复制。
public class User implements Cloneable{
//自定义类
public Order o ;
public User(Order o) {
this.o = o;
}
//普通克隆:基本类型克隆
@Override
public User clone() {
User user = null;
try {
user = (User) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return user;
}
}
3、深度克隆
深度复制或者克隆来说,复制后会生成不同的对象。也就是同样创建了另外的对象
最方便的就是使用序列化的机制,注意对象中的属性如果是对象的话,包含的对象也必须实现序列化接口,这样才能被序列化
public class User implements Serializable{
private static final long serialVersionUID = 3917627620747178660L;
//自定义类
public Order o ;
public User(Order o) {
this.o = o;
}
public User deepClone() throws Exception {
// 先对象序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(baos);
out.writeObject(this);
// 对象反序列化
ByteArrayInputStream bin = new ByteArrayInputStream(baos.toByteArray());
ObjectInput in = new ObjectInputStream(bin);
// 返回对象
return (User) in.readObject();
}
}