实现
简单来说,原型模式就是一个类实现了Cloneable接口,然后就可以使用clone方法,又因为clone方法在Object中的作用域是protected类型的,所以需要override clone方法,将protected改成public
类图
代码示例
class Prototype implements Cloneable {
public Prototype clone(){
Prototype prototype = null;
try{
prototype = (Prototype)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
class ConcretePrototype extends Prototype{
public void show(){
System.out.println(“原型模式实现类”);
}
}
public class Client {
public static void main(String[] args){
ConcretePrototype cp = new ConcretePrototype();
for(int i=0; i< 10; i++){
ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
clonecp.show();
}
}
}
优点
- 比new的性能好,复杂的对象,差异非常明显
- 简化对象创建,在循环中科明显提高系统性能
注意:
- clone不会调用构造方法,和单例模式冲突
- clone分深拷贝和浅拷贝,默认就是拷贝,只会拷贝对象中的基本的数据类型
深拷贝例子
public class Prototype implements Cloneable {
private ArrayList list = new ArrayList();
public Prototype clone(){
Prototype prototype = null;
try{
prototype = (Prototype)super.clone();
prototype.list = (ArrayList) this.list.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
细节:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。
学习资料:
- 卡奴达摩的专栏