1. 程式人生 > 其它 >Prototype原型模式

Prototype原型模式

定義:

  prototype pattern是指原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。是一種建立模式。

角色

  • Prototype(抽象原型類):它是宣告克隆方法的介面,是所有具體原型類的公共父類,可以是抽象類也可以是介面,甚至還可以是具體實現類。

  • ConcretePrototype(具體原型類):它實現在抽象原型類中宣告的克隆方法,在克隆方法中返回自己的一個克隆物件。

  • Client(客戶類):讓一個原型物件克隆自身從而建立一個新的物件,在客戶類中只需要直接例項化或通過工廠方法等方式建立一個原型物件,再通過呼叫該物件的克隆方法即可得到多個相同的物件。由於客戶類針對抽象原型類Prototype程式設計,因此使用者可以根據需要選擇具體原型類,系統具有較好的可擴充套件性,增加或更換具體原型類都很方便。

適用場景:

  1. 資源優化場景---類初始化消耗太多資源,這個資源包括資料、硬體資源等
  2. 建構函式比較複雜
  3. JAVA建立類例項基本上是適用new關鍵字。有時候需要使用 “在不指定類名的前提下生成例項”的需求。
  4. 物件種類繁多,無法將他們整合到一個類中
  5. 難以根據類生成例項,
  6. 解耦框架和生成的例項
  7. 效能和安全要求的場景--通過new產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。
  8. 一個物件多個修改者的場景---一個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。

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

Java融為渾然一體,大家可以隨手拿來使用。

缺點

1、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。

2、實現原型模式每個派生類都必須實現 Clone介面。

3、逃避建構函式的約束。

 

 

一旦在類中使用到了別的類名,就不能和該類分離,也無法實現複用。也就意味著兩者是耦合在一起的。

日常框架中的prototype有:Spring中,原型模式應用的非常廣泛,scope='prototype',還有JSON.parseObject()也是原型模式。

 

原型模式的核心就是克隆方法

java的Object類的clone方法和java.lang.cloneable介面:clone方法是淺拷貝

 

淺克隆:

  • 在淺克隆中,如果原型物件的成員變數是值型別,將複製一份給克隆物件;如果原型物件的成員變數是引用型別,則將引用物件的地址複製一份給克隆物件,也就是說原型物件和克隆物件的成員變數指向相同的記憶體地址。

  • 簡單來說,在淺克隆中,當物件被複制時只複製它本身和其中包含的值型別的成員變數,而引用型別的成員物件並沒有複製。

  • 在Java語言中,通過覆蓋Object類的clone()方法可以實現淺克隆。

深克隆:

  • 在深克隆中,無論原型物件的成員變數是值型別還是引用型別,都將複製一份給克隆物件,深克隆將原型物件的所有引用物件也複製一份給克隆物件。

  • 簡單來說,在深克隆中,除了物件本身被複制外,物件所包含的所有成員變數也將複製。

  • 在Java語言中,如果需要實現深克隆,可以通過序列化(Serialization)等方式來實現。需要注意的是能夠實現序列化的物件其類必須實現Serializable介面,否則無法實現序列化操作。