設計模式:克隆模式

1.原型模式定義:

原型模式的定義如下:用一個已經創建的實例作爲原型,通過複製該原型對象來創建一個和原型相同或相似的新對象。用這種方式創建對象非常高效,根本無須知道對象創建的細節。

2.細節:

  • 抽象原型類:規定了具體原型對象必須實現的接口。
  • 具體原型類:實現抽象原型類的clone方法。

如果沒有實現Cloneable接口則會拋異常:java.lang.CloneNotSupportedException

源碼中解釋如下:

Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.

代碼實例:

(一)

@Data
public class People implements Cloneable{
    private String name;
    private String addr;
}

(二) 

import lombok.Data;

@Data
public class Employee extends People {
    private Long salary;

    public Employee() {
        super();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

(三)

class TestEmp {
    public static void main(String[] args) throws CloneNotSupportedException {
        Employee employee = new Employee();
        Object o = employee.clone();
        System.out.println(o instanceof Employee);
    }
}

運行結果:

------------------
true
-------------------

爲此我們再來看一個問題,我們看Employee中重寫的clone()方法:

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

有沒有這樣一個疑問:我操,我調用的是父類的clone()然後他返回的是一個object對對象,可是當我判斷:

System.out.println(o instanceof Employee);的時候他竟然輸出的是true,why???

答:Object中的clone執行的時候使用了RTTI(run-time  type  identification)的機制,動態得找到目前正在調用 clone方法的那個reference,根據它的大小申請內存空間,然後進行bitwise的複製,將該對象的內存空間完全複製到新的空間中去,從而達 到shallowcopy的目的。(參考博客:https://blog.csdn.net/naughty610/article/details/5307755

 

關於克隆,他到底是怎麼克隆的呢?

博客推薦:https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484930&idx=1&sn=68bcd988c1658377e288a26a8effa17d&source=41#wechat_redirect(非常詳細) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章