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)
關於克隆,他到底是怎麼克隆的呢?