[一天一个设计模式]-[原型模式]
原型模式即通过一个已有的对象clone出一个一样的对象,当直接创建该对象非常消耗资源时则可以考虑原型模式。实现克隆操作,继承 Cloneable,重写object的 clone()。
克隆分深度克隆和浅度克隆
浅度克隆:只把需要克隆对象的成员变量的值复制过去,如果是引用变量也只会复制引
用地址,指向的和原对象是同一个对象。
深度克隆:把需要克隆对象的引用成员变量也克隆一份。
浅度克隆
public class SimpleClone implements Cloneable {
public int s = null;
public SimpleClone() {
}
public Object clone() {
SimpleClone newSimpleClone = null;
try {
/* 浅克隆 */
newSimpleClone = (SimpleClone)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return newSimpleClone;
}
}
深度克隆
重写clone方法,在clone方法中把需要克隆的成员变量也clone一份让后赋值
(此方法只支持,成员变量也为cloneable)
public class SimpleClone implements Cloneable {
public Object s = null;
public SimpleClone() {
}
public Object clone() {
SimpleClone newSimpleClone = null;
try {
/* 浅克隆 */
newSimpleClone = (SimpleClone)super.clone();
newSimpleClone.s=s.clone()
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return newSimpleClone;
}
}
通过序列化方式(此方式需要成员变量均实现Serializable接口)
public class SimpleClone implements Cloneable,Serializable {
public Object s = null;
public SimpleClone() {
}
public Object clone() {
SimpleClone newSimpleClone = null;
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
newSimpleClone = ois.readObject();
ois.close();
} catch (IOException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return newSimpleClone;
}
}