原型模式用来创建与现有对象相同的对象,新创建的对象状态完全由对象所属类确定。外部需要与现有对象相同状态的对象时,不需关心对象中的状态,对象如何构造,怎样初始化。只需让对象本身处理新对象的构造。这对于仅关心对象现有状态,不关心以后的状态的需求是很有用的。
如下是原型模式代码:
1、浅拷贝
浅拷贝拷贝对象的对象所有原始数据类型,对于引用类型不进行拷贝。新拷贝的对象中,引用类型对象还是指向与原始对象引用执行相同,也就是其中的引用类型对象未进行拷贝。
/**
* 浅复制,仅复制基本类型,不带其他属性。
*/
@Override
public Prototype clone() throws CloneNotSupportedException{
try {
Prototype p = (Prototype)super.clone();
return p;
} catch (CloneNotSupportedException e) {
// ignore
}
return null;
}
2、深拷贝的两种方式
对于采用流的方式进行拷贝效率较低,并且相应的实体需要实现java.lang.Serializable接口。
/**
* 深复制
* @return
*/
public Prototype deepClone(){
try {
Prototype cloned = clone();
cloned.other = other.clone();
return cloned;
} catch (CloneNotSupportedException e) {
// ignore
}
return null;
}
/**
* 深复制,此种方式复制较慢,100万对象在i7机器需要10秒以上。
* @return
*/
public Prototype deepClone1(){
try {
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(bytesOut);
objectOut.writeObject(this);
ByteArrayInputStream in = new ByteArrayInputStream(bytesOut.toByteArray());
ObjectInputStream objectInput = new ObjectInputStream(in);
return (Prototype)objectInput.readObject();
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
return null;
}