利用序列化和反序列化也可以实现深拷贝
package prototype;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 浅拷贝羊
*
* @author Shaw
* @date 2020/4/19 15:59
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Sheep implements Cloneable, Serializable {
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package prototype;
import java.io.*;
import java.util.Date;
/**
* 原型模式:利用序列化和反序列化实现深拷贝
*
* @author Shaw
* @date 2020/4/19 16:38
*/
public class Client3 {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date(111111111111L);
Sheep s1 = new Sheep("sh", date);
System.out.println(s1);
System.out.println(s1.getName() + ":" + s1.getBirthday());
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
Sheep s2 = null;
//使用序列化,反序列化实现深拷贝
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)
) {
oos.writeObject(s1);
byte[] bytes = bos.toByteArray();
bis = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bis);
//克隆羊
s2 = (Sheep) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
date.setTime(22222222222L);
System.out.println(s1.getBirthday());
System.out.println(s2.getBirthday());
}
}
运行结果:
可以看到两只羊使用的并不是同一个date对象了。