Head First設計模式之原型模式

2021-09-22 17:25:45 字數 1765 閱讀 8221

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

原型模式是一種比較簡單的模式,也非常容易理解,實現乙個介面,重寫乙個方法即完成了原型模式。在實際應用中,原型模式很少單獨出現。經常與其他模式混用,他的原型類prototype也常用抽象類來替代。

原型模式主要用於物件的複製,它的核心是就是類圖中的原型類prototype。prototype類需要具備以下兩個條件:

namespace

designpatterns.prototype

}/**

* 計畫

* 【淺拷貝】 */

public

class

plan

public

string

getname()

public

void setname(string

name)

public

datetime getstartdate()

public

void

setstartdate(datetime startdate)

public

datetime getenddate()

public

void

setenddate(datetime enddate)

public listgetexecutors()

public

void setexecutors(listexecutors)

public

intgetlevel()

public

void setlevel(int

level)

public

string

tostring()}}

1、資源優化場景。

2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。

3、效能和安全要求的場景。

4、通過 new 產生乙個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。

5、乙個物件多個修改者的場景。

6、乙個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。

7、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立乙個物件,然後由工廠方法提供給呼叫者。

注意事項:與通過對乙個類進行例項化來構造新物件不同的是,原型模式是通過拷貝乙個現有物件生成新物件的。淺拷貝實現 cloneable,重寫,深拷貝是通過實現 serializable 讀取二進位製流。

優點:

1、對客戶端隱藏具體的實現型別:原型模式的客戶端,只知道原型介面的型別,並不知道具體的實現型別,從而減少了客戶端對這些具體實現型別的依賴。

2、在執行時動態改變具體的實現型別:原型模式可以在執行期間,由客戶來註冊符合原型介面的實現型別,也可以動態的改變具體的實現型別,看起來介面沒有任何變化,但其實執行的已經是另外乙個類例項了。因為轉殖乙個原型就類似於例項化乙個類。

缺點:

深度轉殖方法實現會比較困難:原型模式最大的缺點就在於每個原型的子類都必須實現clone的操作,尤其在包含引用型別的物件時,clone方法會比較麻煩,必須要能夠遞迴的讓所有的相關物件都要正確的實現轉殖。

參考:歡迎閱讀本系列文章:head first設計模式之目錄

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...

Head First設計模式之組合模式

將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...