1. 程式人生 > 其它 >設計模式-原型模式,深拷貝,淺拷貝

設計模式-原型模式,深拷貝,淺拷貝

原型模式: 原型模式其實就是從一個物件在建立另一個可定製的物件,而且不需要知道任何建立的細節 對於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,說明已實現深拷貝