创建模式之原型模式 深克隆

来源:互联网 发布:win7设置禁止安装软件 编辑:程序博客网 时间:2024/06/06 03:03

接下来看下深克隆:

package com.djk.design.factory.clone;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class DeepClone implements Serializable{/** *  */private static final long serialVersionUID = 8006468601991987083L;private String name;private int age;private Teacher teacher;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public DeepClone getDeepClone(){try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return (DeepClone)ois.readObject();} catch (Exception e) {return null;}}@Overridepublic String toString(){return "DeepClone [age=" + age + ", name=" + name + ", teacher="+ teacher + "]";}}

package com.djk.design.factory.clone;import java.io.Serializable;public class Teacher implements Serializable{/** *  */private static final long serialVersionUID = -8420832563290777627L;private String terchearName;private int terchearAge;public String getTerchearName() {return terchearName;}public void setTerchearName(String terchearName) {this.terchearName = terchearName;}public int getTerchearAge() {return terchearAge;}public void setTerchearAge(int terchearAge) {this.terchearAge = terchearAge;}@Overridepublic String toString() {return "Teacher [terchearAge=" + terchearAge + ", terchearName="+ terchearName + "]";}}上面利用了对象的序列化完成了深克隆,深克隆将克隆对象里面引用的对象也克隆了一份,要注意的是对里面引用的对象也需要实现序列化

序列化加序列号的原因是:比如一个对象在A版本有个属性是String 类型的name,到了B版本,这个对象的这个属性没了或者增加了别的属性,这时候将之前A版本的对象进行反克隆的时候会报错,因为java发现2个版本的克隆对象发生了变化,解决的方法就是加个序列号,所以加序列号的目的是为了克隆对象的兼容性.

序列化的时候注意:静态的属性不会被序列化  ,被transient修饰的属性不会被序列化。

0 0