原型模式(浅克隆)
class Prototype implements Cloneable{
public Prototype clone(){
Prototype prototype = null;
try{
prototype = (Prototype)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
class PrototypeBean extends Prototype{
public void sayHello{
Log.i("smallstrong","sayHello");
}
}
继承 Prototype,这个实体类就是我们想要copy的类
public class Client{
public static void main(String args[]){
PrototypeBean prototype = new PrototypeBean();
PrototypeBean newPrototype;
newPrototype = (PrototypeBean)prototype.clone();
newPrototype.sayHello();
}
}
客户端先创建一个PrototypeBean实例,之后调用clone方法来创建新的实例
浅克隆与深克隆
- 浅克隆指的是在克隆过程中仅仅只是对值类型(int boolean String等)进行了copy,而对于引用类型(对象,数组等)的只是copy了地址,并没有实际开辟一块引用类型变量的内存空间。
- 深克隆指的是类中的不管值类型还是引用类型,统统都在内存空间中重新创建。(可以通过实现序列化将对象通过流的方式copy,或者把所有引用类型的也都实现Cloneable,一并clone)
优点:
- 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个 已有实例可以提高新实例的创建效率。
缺点
- 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了 实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。