设计模式-原型模式,深拷贝,浅拷贝


原型模式: 原型模式其实就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节   对于java而言,也就是不通过类的构造方法来生成对象,而是基于对象来创建另一个对象 Cloneable接口和clone方法,就是java语言对于原型模式的实现,开箱即用   在使用构造方法创建对象开销很大的情况下,使用克隆是一个很好的办法 在克隆中,有浅拷贝和深拷贝的概念   浅拷贝:基本类型可以复制一份,但是引用类型复制的是地址,实质还是同一个对象,修改原对象中引用类型的值会导致新对象中相同属性的值改变   深拷贝:使得引用类型的值也复制出来一份,改变原对象引用类型的值不会影响新对象中相同属性的值  
@Data
class Resume implements Cloneable{

    private String name;
    private Integer age;
    private Integer sex;
    private Address address;

    public Resume(String name) {
        this.name = name;
    }

    @Override
    protected Resume clone(){
        Resume r = null;
        try {
            r = (Resume)super.clone();
            //实现深拷贝的关键,应用类型需要调用克隆方法
            //r.address = this.address.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return r;
    }
}

@Data
class Address implements Cloneable{
    private String address;

    public Address(String address) {
        this.address = address;
    }

    //实现深拷贝的关键,应用类型需要调用克隆方法
    @Override
    protected Address clone(){
        Address a = null;
        try {
            a = (Address) super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return a;
    }
}
public static void main(String[] args) {
    Resume A = new Resume("小A合同");
    A.setAddress(new Address("地球村"));
    Resume B = A.clone();
}
java另一种常用实现深拷贝的方法:序列化 给一个例子:

//使用序列化来实现深拷贝
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(A);
oos.close();


byte[] bytes = baos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
Resume C = (Resume) ois.readObject();
ois.close();

System.out.println(A == C);
System.out.println(A.getAddress() == C.getAddress());
看到结果两个false,说明已实现深拷贝