設計模式之原型模式

2021-08-22 10:20:22 字數 4017 閱讀 1907

原型模式(prototype pattern)是建立模式的一種,其作用是提高建立效率,減少計算機資源開銷,與工廠模式類似的是,都遮蔽了物件例項化的過程…

從上面的uml圖可以看出,原型模式涉及到的角色有如下三個:

淺拷貝

class address 

public

class

customer

implements

cloneable

@override

public string tostring() ';

}}public

class

prototypedemo

}

結果

///

//////

//////

//////

//////

//////

//////

//////

///// 修改前原始資訊資訊 - 開始 ///

//////

//////

//////

//////

//////

//////

//////

/////

原始資訊:customer, hobbies=[籃球, 足球], customer-hashcode=460141958, address-hashcode=1163157884}

拷貝資訊:customer, hobbies=[籃球, 足球], customer-hashcode=1956725890, address-hashcode=1163157884}

//////

//////

//////

//////

//////

//////

//////

//////// 修改前原始資訊資訊 - 結束 ///

//////

//////

//////

//////

//////

//////

//////

/////

分析: 從日誌中可以發現,我們無需通過new object()的方式去例項化物件,而是呼叫object.clone()同樣可以,customerhashcode也發生了改變,由此可以推斷出它們的引用已經發生變化了,但是addresshashcode一模一樣,前面說到過cloneable是淺轉殖的,並不會拷貝其它引用物件

淺拷貝案例二

public

class prototypedemo

}

結果

///

//////

//////

//////

//////

//////

//////

//////

///// 修改後原始資訊資訊 - 開始 ///

//////

//////

//////

//////

//////

//////

//////

/////

原始資訊:customer, hobbies=[籃球, 足球, **], customer-hashcode=460141958, address-hashcode=1163157884}

拷貝資訊:customer, hobbies=[籃球, 足球, **], customer-hashcode=1956725890, address-hashcode=1163157884}

//////

//////

//////

//////

//////

//////

//////

//////// 修改後原始資訊資訊 - 結束 ///

//////

//////

//////

//////

//////

//////

//////

/////

分析customer本身的屬性值修改與原始物件並不衝突,它們都是各自乙份,但集合型別修改後,轉殖物件輸出的與原始物件如出一轍,不難發現cloneable的淺轉殖範圍只支援基本型別。

總結一下就是:我們用的是object的clone方法,而該方法只拷貝按值傳遞的資料,比如string型別和基本型別,但物件內的陣列、引用物件都不拷貝,也就是說記憶體中原型例項和拷貝例項指向同乙個引用物件的位址,這就是淺拷貝。

類似於這張圖,圖是從這扒過來的,這裡的money即可以看做這裡的name指,我們在轉殖後修改了原物件的name值,轉殖後的物件的name值也發生了變化,即表明基本型別是淺轉殖,指向的是同乙個引用位址。

序列化實現深度轉殖

class

address

implements

cloneable,serializable

public

class

customer

implements

cloneable, serializable

}public

class

prototypedemo

}

結果

///

//////

//////

//////

//////

//////

//////

//////

///// 深淺轉殖 - 開始 ///

//////

//////

//////

//////

//////

//////

//////

/////

深轉殖:customer, hobbies=[籃球, 足球, **, 電影], customer-hashcode=1020371697, address-hashcode=789451787}

//////

//////

//////

//////

//////

//////

//////

//////// 深淺轉殖 - 結束 ///

//////

//////

//////

//////

//////

//////

//////

/////

分析:實現serializable,通過序列化的方式與原始資料完全脫離關係,從而達到深度轉殖效果,當然一般用serializationutils.clone(original)方式比我們自己寫的會更好

深拷貝的記憶體變化如下圖:

深拷貝除了需要拷貝值傳遞的資料,還需要拷貝引用物件、陣列,即把所有引用的物件都拷貝。需要注意的是拷貝的引用物件是否還有可變的類成員物件,如果有就繼續對該成員物件進行拷貝,如此類推。所以使用深拷貝是注意分析拷貝有多深,以免影響效能。優點

缺點 適用場景

注意點

設計模式之原型模式

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

設計模式之原型模式

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

設計模式之原型模式

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