用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
意圖:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
主要解決:在執行期建立和刪除原型。
如何解決:利用已有的乙個原型物件,快速地生成和原型物件一樣的例項。
優點:1、效能提高(隱藏了物件建立的細節)。 2、逃避建構函式的約束。
缺點:1、配備轉殖方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當乙個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。 2、必須實現 cloneable 介面。
參考:cloneable其實就是乙個標記介面(介面沒有任何方法),只有實現這個介面後,然後在類中重寫object中的clone方法,然後通過類呼叫clone方法才能轉殖成功,如果不實現這個介面,則會丟擲clonenotsupportedexception(轉殖不被支援)異常。
1、淺度轉殖(只複製值型別,不複製引用型別)
public class student
public void setname(string name)
public int getage()
public void setage(int age)
public stringbuffer get***()
public void set***(stringbuffer ***)
@override
public string tostring()
}
public class school implements cloneable
public void setschoolname(string schoolname)
public int getstunums()
public void setstunums(int stunums)
public student getstu()
public void setstu(student stu)
@override
protected school clone() throws clonenotsupportedexception
@override
public string tostring()
}
public static void main(string args) throws clonenotsupportedexception
實驗結果:
可以看出s1與s2的hashcode不同,也就是說clone方法並不是把s1的引用賦予s2,而是在堆中重新開闢了一塊空間,將s1複製過去,將新的位址返回給s2。
但是s1中stu的hashcode與s2中stu的hashcode相同,也就是這兩個指向了同乙個物件,修改s2中的stu會造成s1中stu資料的改變。但是修改s2中的基本資料型別與stirng型別時,不會造成s1中資料的改變,基本資料型別例如int,在clone的時候會重新開闢乙個四個位元組的大小的空間,將其賦值。而string則由於string變數的唯一性,如果在s2中改變了string型別的值,則會生成乙個新的string物件,對之前的沒有影響。 這就是淺度轉殖。
2、深度轉殖
在原clone方法裡面,將student手動轉殖一下
@override
protected school clone() throws clonenotsupportedexception
如果有些欄位未實現cloneable,則無法深度轉殖
深拷貝和淺拷貝區別:
最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用。
大話設計模式 原型模式
學無止境,精益求精 十年河東,十年河西,莫欺少年窮 學歷代表你的過去,能力代表你的現在,學習代表你的將來 上篇部落格介紹了c 深淺複製,其實原型模式講的主要就是物件的深淺複製 參考 c 深淺複製 memberwiseclone ok,言歸正傳 原型模式的概念 用原型例項指定建立物件的種類,並且通過拷...
《大話設計模式》 原型模式
如果物件的建立成本比較大,而同乙個類的不同物件之間差別不大 大部分欄位都相同 在這種情況下,我們可以利用對已有物件 原型 進行複製 或者叫拷貝 轉殖 的方式,來建立新物件,以達到節省建立時間的目的。這種基於原型來建立物件的方式就叫作原型設計模式,簡稱原型模式。核心 拷貝 轉殖 建立物件包含的申請記憶...
《大話設計模式 原型模式》筆記
1 原型模式 prototype 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。2 原型模式結構圖 3 簡單 實現 3.1 繼承cloneable介面 public class concrereprototype implements cloneable public string ...