内容都是从Tom老师的书中摘抄,记录下来方便自己学习。
原型模式(Prototype Pattern) 是指原型实例指定创建对象的种类,并且通过赋值这些原型创建新的对象。
适用场景:
- 类初始化消耗资源较多;
- 适用new生成一个对象需要非常繁琐的过程(数据准备、访问权限等);
- 构造函数比较复杂;
- 在循环体中产生大量对象。
public class Monkey {
public int height;
public int weight;
public Date birthday;
}
public class JinGuBang implements Serializable {
public float h=100f;
public float d=10f;
public void big(){
this.d *=2;
this.h *=2;
}
public void small(){
this.d /=2;
this.h /=2;
}
}
public class QiTianDASheng extends Monkey implements Cloneable, Serializable {
public JinGuBang jinGuBang;
public QiTianDASheng() {
this.birthday=new Date();
this.jinGuBang=new JinGuBang();
}
@Override
protected Object clone() throws CloneNotSupportedException{
return this.deepClone();
}
public Object deepClone(){
try {
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
QiTianDASheng copy= (QiTianDASheng) ois.readObject();
copy.birthday=new Date();
return copy;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
public Object shallowClone(QiTianDASheng target){
QiTianDASheng qiTianDASheng=new QiTianDASheng();
qiTianDASheng.height=target.height;
qiTianDASheng.weight=target.weight;
qiTianDASheng.jinGuBang=target.jinGuBang;
qiTianDASheng.birthday=new Date();
return qiTianDASheng;
}
}
public class DeepCloneTest {
public static void main(String[] args) {
QiTianDASheng qiTianDASheng=new QiTianDASheng();
try {
QiTianDASheng clone= (QiTianDASheng) qiTianDASheng.clone();
System.out.println("深克隆:"+(qiTianDASheng.jinGuBang==clone.jinGuBang));
}catch (Exception e){
e.printStackTrace();
}
QiTianDASheng qi=new QiTianDASheng();
QiTianDASheng n= (QiTianDASheng) qi.shallowClone(qi);
System.out.println("浅克隆:"+(qi.jinGuBang==n.jinGuBang));
}
}