原型模式的定義:以乙個已經建立的例項作為原型,通過複製該物件來建立乙個和原型相同或相似的新物件。
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份全改了,本來只是改動一點,卻...