简介
概念: 用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,通俗的意思是复制一个一模一样的对象出来,其表现目的是保护最原始的那一份存档。隐藏复制过程。
实现
原型模式在java中实现要点是实现Cloneable接口,覆写Object的clone方法。
// Cloneable标记接口
public class Message implements Cloneable {
int num;
String descriotion;
@Override
public Message clone() {
Message clone = null;
try {
// Object.clone()浅拷贝
clone = (Message) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
扩展
clone的实现其实很简单。以堆上的内存存储解释的话,调用对象a的clone拷贝方法,就是在堆上分配一个和a在堆上所占存储空间一样大的一块地方,然后把a的堆上内存的内容复制到这个新分配的内存空间上,所以该方法创建对象比直接new 一个对象性能好很多。
综上clone的行为直接产生一个问题,就是拷贝的对象和原型对象内的引用变量都会指向同一个依赖对象的内存块,这就可能造成我们在修改拷贝对象引用变量值时,可能同时会修改原型对象的内容(浅拷贝存在的问题),这完全是我们不想看到的问题,解决办法其实很简单,就是在拷贝原型对象后,同时拷贝原型对象内的引用对象(深拷贝)。
在Java中,创建一个堆上对象有五种方式:
- 使用new关键字 → 调用了构造函数
- 使用Class类的newInstance方法 → 调用了默认构造函数
- 使用Constructor类的newInstance方法 → 调用了构造函数
- 使用clone方法 → 没有调用构造函数
- 使用反序列化 → 没有调用构造函数
参考原地址:https://www.jianshu.com/p/c2bfba71bf10
☀>.freerme、我是lilee[https://blog.csdn.net/freerme]