Android架構進階(五)—— 原型模式

原型模式

原型模式:使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象

說白了,原型模式核心便是Ctrl+C 、Ctrl + V。也就是克隆(clone)。

使用場景

  • 創建一個對象,這個對象過於複雜,可以使用原型模式來進行復制一個對象。
  • 需要提供數據對象,同時有需要避免外部對數據對象進行修改。
  • 系統要保存對象狀態的,而對象的狀態改變很小

原型模式的角色

  • Client: 使用者。
  • Prototype: 接口(或抽象類),聲明具備clone能力。
  • ConcretePrototype: 具體的原型類。

深拷貝和淺拷貝

  • 我們以ArrayList()爲例
	ArrayList<String> a = new ArrayList();
	ArrayList<String> b = a;

淺拷貝,就是一個對象通過賦值的方式直接傳遞對象在內存中的內存地址。

	ArrayList<String> a = new ArrayList();
	ArrayList<String> b = a.clone();
	//或者
	ArrayList<String> c = new ArrayList(a);

深拷貝,使用clone方法,關於ArrayList的clone方法:

public Object clone() {
    try {
        ArrayList<?> v = (ArrayList<?>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError(e);
    }
}

原型模式優缺點

優點 1、當創建的對象實例較爲複雜的時候,使用原型模式可以簡化對象的創建過程2、擴展性好,由於寫原型模式的時候使用了抽象原型類,在客戶端進行編程的時候可以將具體的原型類通過配置進行讀取。3、可以使用深度克隆來保存對象的狀態,使用原型模式進行復制。
缺點 1、需要爲每一個類配備一個克隆方法,而且該克隆方法位於一個類的裏面,當對已有的類經行改造時需要修改源代碼,違背了開閉原則。2、在實現深克隆的時需要編寫較爲複雜的代碼,而且當對象之間存在多重嵌套引用的時候,爲了實現深克隆,每一層對象對應的類都必須支持深克隆,實現相對麻煩。

總結

原型模式的本質,就是克隆,可以在某些場景中提升構建對象的效率,也可以保護性拷貝,可以通過返回一個返回對象的形式,實現只讀的限制。

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