当某个对象的数据结构或者构建过程特别复杂(比如复杂计算得出结果),频繁的构建势必会消耗系统性能,这个时候我们采用原型模式对原有的 对象进行克隆,构建新的对象。
即 clone()
-
优点:直接克隆原有实例生成新的实例,免去了复杂的构建过程,节省了系统资源。
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* 浅复制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* 深复制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 写入当前对象的二进制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 读出二进制流产生的新对象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
浅拷贝 & 深拷贝
比如 Hashmap,浅拷贝只会复制索引,不会复制数据本身。浅拷贝得到的对象跟原始对象共享数据;深拷贝既复制索引,也复制数据本身,得到完全独立的对象。
clone() 方法执行的是浅拷贝,只会拷贝对象中的基本数据类型数据(int、long 等),以及引用对象的内存地址,不会拷贝引用对象本身。
浅拷贝:
深拷贝:
Intent 的 clone 方法实现: return new Intent(this); 用于深拷贝:this.mCategories = new HashSet<String>(o.mCategories);
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
-
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html