1. 概述
2. 源码解析
@Data
public class Mail implements Cloneable {
private String name;
private String address;
private String content;
private Date sendTime;
public Mail() {
System.out.println("默认构造函数");
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("使用了Clone函数");
Mail result = (Mail) super.clone();
// 深克隆
Date time = (Date) result.getSendTime().clone();
result.setSendTime(time);
return result;
}
}
/**
* 原型模式:
* 1. 对象必须实现{@link Cloneable#clone()}
* 2. clone对象, 不会调用构造函数, 只会调用clone函数.
* <p>
* 浅克隆和深克隆
* 1. 浅克隆只会克隆基础数据到对象上, 对于复杂的类型, 会被对象之间共享;
* 2. 深克隆需要在{@link Cloneable#clone()}方法中, clone复杂属性.
*/
public class ProtoTypeTest { public static void main(String[] args) throws CloneNotSupportedException {
Mail mail = new Mail();
mail.setContent("原始消息");
mail.setSendTime(new Date());
Mail temp = (Mail) mail.clone();
System.out.println(mail);
System.out.println(temp);
mail.getSendTime().setTime(new Random().nextLong());
System.out.println(mail);
System.out.println(temp);
}
}