原型模式
概述
通过拷贝原型创建新的对象。
在Java中有一个Cloneable接口,只有一个clone方法,实现它即可。
举例
生成简历
clone方法会抛出CloneNotSupportedException,为了代码简单省略。
class Resume implements Cloneable{
private String name;
private int sex;
WorkExperience work;
@Override
protected Object clone(){
return super.clone();
}
}
class WorkExperience{
private String company;
private String position;
}
//客户端
Resume a = new Resume();
a.setName("a");
a.setSex(1);
a.setWorkExperience("A","Java");
Resume b = a.clone();
b.setWorkExperience("B","C++");
分析
直接通过克隆生成新的对象,无需重新初始化,也隐藏了创建的细节。
不过存在一个问题就是浅拷贝与深拷贝,上面例子中WorkExperience是引用类型,对它的拷贝只停留在引用,而引用指向的对象没有拷贝,也就是说a、b两者都指向了同一个对象,所以最后打印出来的两份简历都是("B","C++")。
实现深拷贝(此处仅一层,多层较复杂,需要小心处理)
class WorkExperience implements Cloneable{
...
@Override
protected Object clone(){
return super.clone();
}
}
class Resume implements Cloneable{
...
private Resume(WorkExperience work){
this.work = (WorkExperience)work.clone();
}
@Override
protected Object clone(){
Resume obj = new Resume(this.work);
obj.setName(this.name);
obj.setSex(this.sex);
return obj;
}
}