大話設計模式 原型設計模式

2021-10-14 03:20:56 字數 2254 閱讀 3187

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

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

主要解決:在執行期建立和刪除原型。

如何解決:利用已有的乙個原型物件,快速地生成和原型物件一樣的例項。

優點: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 ...