原型模式
原型模式結構圖:
原型模式結構圖代碼解析:
/**
* Created by 楊Sir on 2017/11/17.
* 原型模式接口,,如果單純是行爲,使用接口最好
* 如果涉及到共性的屬性,則使用抽象類最好。 需要自己權衡。
*/
public interface Prototype extends Cloneable {
public Prototype clone() throws CloneNotSupportedException;
}
/**
* Created by 楊Sir on 2017/11/17.
*/
public class ConcretePrototype implements Prototype{
private String name;
public ConcretePrototype() {
}
public ConcretePrototype(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
@Override
public String toString() {
return "ConcretePrototype{" +
"name='" + name + '\'' +
'}';
}
}
/**
* Created by 楊Sir on 2017/11/17.
*/
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Prototype prototype = new ConcretePrototype("張三");
/**
* 注意對象如果向上轉型爲接口類型,就只能調用接口定義的方法,子類的所有自定義方法不能調用
* 但是可以在使用該子類時將子類向下轉型。
*/
Prototype prototypeClone = prototype.clone();
//爲了修改子類的一些屬性值,調用實現類的方法,需要向下轉型。
ConcretePrototype prototypeClone1 = null;
if(prototype instanceof ConcretePrototype){
prototypeClone1 = (ConcretePrototype) prototype;
}
prototypeClone1.setName("lisi");
System.out.println(prototype);
System.out.println(prototypeClone);
}
}
原型模式主要用於對象的複製,其核心就是Proptotype類。在Java中Prototype需要具備兩個條件:
①. 實現 Cloneable接口。它的作用就是在運行時告知虛擬機可以安全的實現 此接口實現類上的clone().
②. 重寫Object類的 clone()方法,該方法返回一個對象的拷貝。注意重寫時將方法的訪問修飾符改爲 public
在實際開發過程中,原型模式一般會和其他模式混用。
原型模式的優點:
一般在初始化的信息不發生變化的情況下,克隆是最好的創建對象的辦法。這隱藏了對象創建的細節,對性能也大有很大提高,比如大對象的創建,循環創建相同類型對象等。
原型模式要注意的地方:
原型模式複製對象不會調用類的構造方法,因爲不會調用構造方法,所以不管你構造方法訪問權限是什麼,都無所謂。因此這就與單例模式產生了衝突,使用時需要注意。
深複製與潛複製
如果被複制對象的字段是值類型的(這裏包括8中基本數據類型、他們的包裝類型、String),則對該字段執行逐位複製,如果是引用類型,只複製對象的引用而不復制對象本身。因此原始對象與其複本引用同一對象。
深複製把引用對象的變量指向複製過的對象,而不是指向原來被引用的對象。
具體的深複製和淺複製我在另一篇博客《Java深複製與淺複製》中有詳細解釋。