//---------使用序列化和反序列化的方式实现深克隆---------------
package java_234_GOF23设计模式_原型模式_反序列化实现深复制_效率对比_创建型模式总结_练习;
import java.io.Serializable;
import java.util.Date;
/**
-
Sheep羊;使用序列化和反序列化的方式实现深克隆
*/
//添加一个接口;Serializable序列化
public class Sheep implements Cloneable,Serializable {//Cloneable可复制的,可克隆的;一个接口
//2个属性
private String sname;//名字
private Date birthday;//生日
//重写方法
@Override
protected Object clone() throws CloneNotSupportedException {
//clone是Object里面的一个方法;
Object obj = super.clone();//直接调用Object对象的clone()方法
return obj;
//return super.clone();//可以用上面的替代
}
//get与set方法
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}//构造器
public Sheep() {
super();
}
public Sheep(String sname, Date birthday) {
super();
this.sname = sname;
this.birthday = birthday;
}
}
//------------------------测试----------------------
package java_234_GOF23设计模式_原型模式_反序列化实现深复制_效率对比_创建型模式总结_练习;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
/**
-
测试原型模式(使用序列化和反序列化的方式实现深克隆, )
*/
public class Client3 {
public static void main(String[] args) throws Exception {
Date date = new Date(12312321331L);
Sheep s1 = new Sheep(“少利”,date );//随意起的名字及时间
System.out.println(s1);
System.out.println(s1.getSname());
System.out.println(s1.getBirthday());//使用序列化后反序列化实现深复制 //序列化数组;也可以序列化文件 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); //写数据 oos.writeObject(s1);//s1的数据通过oos输出流传递给bos对象输出流 byte[] bytes = bos.toByteArray();//在通过bos返回一个数组 //反序列化 ByteArrayInputStream bis = new ByteArrayInputStream(bytes);//把数组传进 //读取数据 ObjectInputStream ois = new ObjectInputStream(bis); //克隆好一只新羊 Sheep s2 = (Sheep) ois.readObject();//转型;抛出异常 System.out.println("===修改原型对象的属性值==="); date.setTime(23432432423L); System.out.println(s1.getBirthday());// s2.setSname("多利"); System.out.println(s2); System.out.println(s2.getSname()); System.out.println("======"); System.out.println(s2.getBirthday());
}
}
//结果------------------------------------