設計模式從入門到放棄 四 原型模式

2021-10-05 12:44:47 字數 2024 閱讀 8855

// 實現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...