设计模式-原型模式
程序员文章站
2022-06-12 20:21:59
...
大白话就是复制、克隆模式。生活场景就是,比如 现在我写的文章分了 1 2 3 模板结构,那我再写篇新的时候就想复用这个模板。
类似的就是word execl的复制。
用的技术实现:克隆(深拷贝、浅拷贝)
/* @desc 使用Object 的clone() 必须实现 Cloneable 接口
*/
public class WeeklyLog implements Cloneable {
//为了简化设计和实现,假设一份工作周报中只有一个附件对象,
// 实际情况中可以包含多个附件,可以通过List等集合对象来实现
private Attachment attachment;
private String name;
private String date;
private String content;
//使用Object 的clone() 方法实现浅克隆
public WeeklyLog clone() {
Object obj = null;
try {
obj = super.clone();
return (WeeklyLog) obj;
} catch (CloneNotSupportedException e) {
System.out.println("不支持复制!");
return null;
}
}
}
public static void main(String[] args) {
WeeklyLog weeklyLog, weeklyLog1;
weeklyLog = new WeeklyLog();
Attachment attachment = new Attachment(); //创建附件对象
weeklyLog.setAttachment(attachment); //将附件添加到周报中
//使用Object 的clone() 方法实现浅克隆
weeklyLog1 = weeklyLog.clone();
//比较周报
System.out.println("周报是否相同? " + (weeklyLog == weeklyLog1));
//比较附件
System.out.println("附件是否相同? " + (weeklyLog.getAttachment() == weeklyLog1.getAttachment()));
}
周报是否相同? false
附件是否相同? true
很简单详细参照 https://www.cnblogs.com/chenssy/p/3313339.html
深度clone
/**
* 深克隆技术实现了原型对象和克隆对象的完全独立,对任意克隆对象的修改都不会给其他对象产生影响
* ,是一种更为理想的克隆实现方式
*/
public class WeeklyLog implements Serializable {
private static final long serialVersionUID = 3006681994497865454L;
//为了简化设计和实现,假设一份工作周报中只有一个附件对象,
// 实际情况中可以包含多个附件,可以通过List等集合对象来实现
private Attachment attachment;
private String name;
private String date;
private String content;
public WeeklyLog deepClone() {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
//this 当前对象
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (WeeklyLog) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
周报是否相同? false
附件是否相同? false