// 實現cloneable介面 最簡單的原型實現 這裡不能直接用lombok@data 因為@data重寫了hashcode方法導致clone出來的hashcode一樣
@setter
@getter
@tostring
public
class
prototypeclass
implements
cloneable
catch
(clonenotsupportedexception e)
return
newprototypeclass()
;}}// 內部引用型別屬性
@setter
@getter
@tostring
public
class
innerclass
implements
cloneable
catch
(clonenotsupportedexception e)
return
newinnerclass();}}
// 客戶端呼叫 發現他們的屬性 和hashcode 都是一樣的
public
class
prototypetest
}//prototypeclass(name=test, innerclass=innerclass(innername=innerclass))1836019240
//prototypeclass(name=test, innerclass=innerclass(innername=innerclass))1836019240
//prototypeclass(name=test, innerclass=innerclass(innername=innerclass))1836019240
//prototypeclass(name=test, innerclass=innerclass(innername=innerclass))1836019240
以上是最簡單實現原型模式轉殖的最簡單的方法,存在的問題是淺拷貝,無法真正拷貝為物件的屬性。
簡單介紹一下深淺拷貝的問題
// 模擬引用型別實現cloneable介面
public
class
innerclass
implements
cloneable
catch
(clonenotsupportedexception e)
return
newinnerclass()
;}}// 含有引用型別的類
public
class
prototypeclass
implements
cloneable
catch
(clonenotsupportedexception e)
return
newprototypeclass();}}
上面這種方法實現簡單只是把物件的innerclass屬性再次clone,但缺點也很明顯,如果物件有多個引用屬性,每乙個都要去重寫方法很麻煩。下面使用序列化和反序列化實現雖然**麻煩一點,但是使用簡單
@setter
@getter
@tostring
public
class
prototypeclass
implements
cloneable
,serializable
catch
(exception e)
return null;
}}
首先所有類包括引用成員型別的變數都實現序列化介面
將物件序列化寫出到流,然後用輸入流讀回來返回
設計模式從入門到放棄 二十 狀態模式
狀態模式 state pattern 屬於行為模式,主要用來解決物件在多狀態切換時,需要對外輸出不同行為的問題。狀態和行為一一對應,狀態之間可以相互轉換。使用場景在於 中有大量對物件狀態相關的判斷的條件語句的時候較為適合。context 上下文物件 用於維護state的例項 維護當前的狀態 stat...
設計模式筆記四 原型模式
基本介紹 原型模式 prototype 模式 是指 用原型例項指定建立物件的種類,並且通過拷貝這些原型,建立新的物件 原型模式是一種建立型設計模式,允許乙個物件再建立另外乙個可定製的物件,無需知道如何建立的細節 工作原理是 通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型...
設計模式從入門到放棄 十九 直譯器模式
直譯器模式 interpreter pattern 屬於行為模式,根據給定的語言表示式,選擇定義的直譯器,使用不同的直譯器來解析表示式得到最終的結果。類似的設計模式在sql解析,正規表示式,計算器,編譯器,模板引擎等大量使用。context 環境上下文 儲存除直譯器外的全域性資訊 abstracte...