初始設計模式之原型模式

2022-07-26 05:30:29 字數 3240 閱讀 2809

原型模式再理解

​ 原型模式是一種建立型設計模式,prototype模式允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是:通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們自己來實施建立。

​ 它主要面對的問題是:「某些結構複雜的物件」的建立工作;由於需求的變化,這些物件經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的介面。

淺拷貝
淺拷貝是按位拷貝物件,它會建立乙個新物件,這個物件有著原始物件屬性值的乙份精確拷貝。如果屬性是基本型別,拷貝的就是基本型別的值;如果屬性是記憶體位址(引用型別),拷貝的就是記憶體位址 ,因此如果其中乙個物件改變了這個位址,就會影響到另乙個物件。即預設拷貝建構函式只是對物件進行淺拷貝複製(逐個成員依次拷貝),即只複製物件空間而不複製資源。

class tag

public string getname()

public void setname(string name)

@override

public string tostring() }

class bottle implements cloneable

public tag gettag()

public void settag(tag tag)

public string getcolor()

public void setcolor(string color)

public double getprice()

public void setprice(double price)

@override

public string tostring()

public object clone() throws clonenotsupportedexception }

public static void main(string args) catch (clonenotsupportedexception e) }}

//執行結果:

/* * 執行拷貝

* 此時不做修改:

* a:bottle [tag=tag [name=礦泉水], color=blue, price=3.0]

* b:bottle [tag=tag [name=礦泉水], color=blue, price=3.0]

* 此時已經修改了引用型別和基本資料型別:

* a:bottle [tag=tag [name=純淨水], color=blue, price=3.0]

* b:bottle [tag=tag [name=純淨水], color=red, price=3.0]

**/

簡單說明:原型類需要實現cloneable介面並重寫,clone()方法。我們看以上程式執行結果可以驗證,引用型別tag類在修改時,原型對應的值也跟隨改變;而拷貝後的物件的基礎資料型別改變後,原型並未跟隨改變。

深拷貝

深拷貝,在拷貝引用型別成員變數時,為引用型別的資料成員另闢了乙個獨立的記憶體空間,實現真正內容上的拷貝。

class tag implements cloneable

public string getname()

public void setname(string name)

@override

public string tostring()

public object clone() throws clonenotsupportedexception }

class bottle implements cloneable

public tag gettag()

public void settag(tag tag)

public string getcolor()

public void setcolor(string color)

public double getprice()

public void setprice(double price)

@override

public string tostring()

public object clone() throws clonenotsupportedexception }

public static void main(string args) throws clonenotsupportedexception

}/*執行結果:

* * 執行拷貝

* 此時不做修改:

* a:bottle [tag=tag [name=礦泉水], color=blue, price=3.0]

* b:bottle [tag=tag [name=礦泉水], color=blue, price=3.0]

* 此時已經修改了引用型別和基本資料型別:

* a:bottle [tag=tag [name=礦泉水], color=blue, price=3.0]

* b:bottle [tag=tag [name=純淨水], color=red, price=3.0]

**/

簡單說明:與淺拷貝相比,引用型別的值並不會影響到其他物件。在**上,則是對引用型別也實現了cloneable介面,並重寫clone()方法。並在bottle類的clone()方法裡進行了tag類的clone()方法的呼叫。關於深拷貝還有其他的實現方法,但在這裡沒有寫出。

可以考慮使用的場景:

在需要乙個類的大量物件的時候,使用原型模式是最佳選擇,因為原型模式是在記憶體中對這個物件進行拷貝,要比直接new這個物件效能要好很多,在這種情況下,需要的物件越多,原型模式體現出的優點越明顯。

如果乙個物件的初始化需要很多其他物件的資料準備或其他資源的繁瑣計算,那麼可以使用原型模式。

當需要乙個物件的大量公共資訊,少量字段進行個性化設定的時候,也可以使用原型模式拷貝出現有物件的副本進行加工處理。

以上就是全部內容,如有錯誤,歡迎交流指正。

設計模式之原型模式

原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...

設計模式之原型模式

include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...

設計模式之原型模式

原型模式的思想就是將乙個物件作為原型,對其進行複製 轉殖,產生乙個和原物件類似的新物件 複製過程可分為淺複製和深複製。淺複製是指直接呼叫父類 即object類 的clone方法 super.clone 該方法是本地 native 方法,呼叫該方法clone出來的新物件,基本資料型別的屬性變數是新建立...