設計模式(建立型) 原型模式

2021-10-14 11:45:42 字數 1941 閱讀 3645

原型模式的定義:以乙個已經建立的例項作為原型,通過複製該物件來建立乙個和原型相同或相似的新物件。

1.複製在效能上比直接 new 乙個物件更加優良。

2.可以使用深拷貝方式儲存物件的狀態,使用原型模式將物件複製乙份,並將其狀態儲存起來,可輔助實現撤銷操作。

1.需要為每乙個類配備乙個轉殖方法,對已有的類進行改造時,需要修改源**,違背了「開閉原則」

2.在實現深轉殖時需要編寫較為複雜的**,且當物件之間存在多重的巢狀引用時,需要對每一層物件對應的類都必須支援深轉殖

當建立新物件成本較高時或需要建立大量相同或相似的物件時

乙個類實現coneable介面,重寫clone方法即完成了乙個最簡單的原型模式

public

class

student

implements

cloneable

public

void

setage

(int age)

public string getname()

public

void

setname

(string name)

@override

protected student clone()

throws clonenotsupportedexception

}

測試,debug看一下student1與student2的區別

可以看到student1與student2兩個物件的name欄位的記憶體位址是一樣的,也就是兩個物件引用了同乙個name欄位,這是因為實現cloneable介面屬於淺拷貝

淺拷貝:如果原型物件的成員變數是基本資料型別(int、double、byte、boolean、char等),將複製乙份給轉殖物件;

如果原型物件的成員變數是引用型別,則將引用物件的位址複製乙份給轉殖物件,也就是說原型物件和轉殖物件的成員變數指向相同的記憶體位址,通過覆蓋object類的clone()方法可以實現淺轉殖

深拷貝:無論原型物件的成員變數是基本資料型別還是引用型別,都將複製乙份給轉殖物件,如果需要實現深轉殖,可以通過序列化(serializable)等方式來實現

原型模式是記憶體二進位製流的拷貝,比new物件效能高很多

要實現深拷貝,要實現序列化介面serializable

**如下

public

class

student

implements

cloneable

, serializable

public

void

setage

(int age)

public string getname()

public

void

setname

(string name)

@override

protected student clone()

throws clonenotsupportedexception

/** * 深拷貝

* @return

* @throws ioexception

*/public student deepclone()

throws ioexception

catch

(classnotfoundexception e)

}}

測試

name屬性位址不同,兩個物件都有屬於自己的name欄位,實現了深拷貝

建立型設計模式 原型模式

總結 羊 program ade someproblem author cade franklin create 2019 12 22 22 12 public class sheep tostring setter getter program ade someproblem author cad...

建立型設計 原型模式

宣告一下 本文的文字多數文字都是來自網上,只有例子是自己寫的。因為自我感覺還沒有能力能夠系統的解釋乙個模式,已經有現成的比較完善的說明,就不重複造輪子哈。原型模式是一種建立型設計模式,它通過複製乙個已經存在的例項來返回新的例項,而不是新建例項.被複製的例項就是我們所稱的原型,這個原型是可定製的。原型...

原型模式 建立型設計模式四

一 原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。用例項來說話 我要發簡歷,自己寫了乙份模板,然後複製了n 份。如下 模板 class resume 客戶端 static void main string args 如果現在我想改,那就得把n份全改了,本來只是改動一點,卻...