原型模式

原型模式

原型模式結構圖:
這裏寫圖片描述

原型模式結構圖代碼解析:

/**
 * 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深複製與淺複製》中有詳細解釋。

發佈了53 篇原創文章 · 獲贊 43 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章