原型模式(prototype)
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节,所谓原型模式,就是java中克隆技术,以某个对象为原型,复制出新的对象,显然新的对象具备原型对象的特点,效率高(避免了重新执行构造过程步骤)
原型模式也是创造型模式,首先有一个原型,数据内容相同,但对象实例不同
代码实现
浅克隆
//浅克隆复制对象的变量还是指向原来的引用,所以改变这个值,之前的也会改变
public class Prototype implements Cloneable {
public String name;
CloneTarget target = null;
// public ArrayList<CloneTarget> list;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTarget extends Prototype {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTest {
public static void main(String[] args) {
CloneTarget p = new CloneTarget();
p.name = "Tom";
// p.list = new ArrayList<CloneTarget>();
// p.list.add(new CloneTarget());
p.target = new CloneTarget();
System.out.println(p.target);
try {
CloneTarget obj = (CloneTarget) p.clone();
System.out.println(obj.target);
} catch (Exception e) {
e.printStackTrace();
}
}
}
深克隆
//深克隆相当于重新创建了一个对象,但是这个对象有上个对象的数据,如果使用new的方式还要一个一个给属性赋值
ublic 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 QiTianDaSheng copy(QiTianDaSheng target){
QiTianDaSheng qiTianDaSheng = new QiTianDaSheng();
qiTianDaSheng.height = target.height;
qiTianDaSheng.weight = target.height;
qiTianDaSheng.jinGuBang = new JinGuBang();
qiTianDaSheng.jinGuBang.h = target.jinGuBang.h;
qiTianDaSheng.jinGuBang.d = target.jinGuBang.d;
qiTianDaSheng.birthday = new Date();
return qiTianDaSheng;
}
}
public class Monkey {
public int height;
public int weight;
public Date birthday;
}
public class Main {
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 q = new QiTianDaSheng();
QiTianDaSheng n = q.copy(q);
System.out.println(q.jinGuBang == n.jinGuBang);
}
}