原型模式
定义
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。
类图
实现
1. 浅拷贝
@Data
public class SearchWords implements Cloneable{
String keyWorld;
long updateTimeStamp;
long lastUpdateTime;
ReferenceClass referenceClass;
public SearchWords(String keyWorld, long lastUpdateTime) {
this.keyWorld = keyWorld;
this.lastUpdateTime = lastUpdateTime;
}
@Override
protected SearchWords clone() throws CloneNotSupportedException {
SearchWords content = null;
try {
content = (SearchWords)super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
@Override
public String toString() {
return "SearchContent{" +
"keyWorld='" + keyWorld + '\'' +
", updateTimeStamp=" + updateTimeStamp +
'}';
}
}
2. 深拷贝
public Object deepCopy(Object object) throws Exception{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bo);
objectOutputStream.writeObject(object);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}
总结
浅拷贝
和深拷贝
的区别在于:浅拷贝
只会复制的索引,不会复制数据本身。相反,深拷贝
不仅会复制索引
,还会复制数据本身
。浅拷贝得到的对象和原始对象共享数据
,而深拷贝得到的是一份独立的对象
。- 如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了