概述

通过拷贝原型创建新的对象。

在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;
    }
}