原型模式即通过一个已有的对象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
;
}
}