原型模式指的是用原型例項指定建立物件的種類,並且通過拷貝這些原型來建立新的物件,允許乙個物件再建立另外乙個可定製的物件而無需知道如何建立的細節。
prototype : 原型類,宣告乙個轉殖自己的介面。
concreteprototype: 具體的原型類 , 實現乙個轉殖自己的操作。
client: 讓乙個原型物件轉殖自己,從而建立乙個新的物件屬性一樣。
public
class
sheep
implements
cloneable
public string getname()
public
void
setname
(string name)
public
intgetage()
public
void
setage
(int age)
public string getcolor()
public
void
setcolor
(string color)
@override
public string tostring()
// 轉殖該例項,使用預設的clone方法來完成
@override
protected object clone()
catch
(exception e)
// todo auto-generated method stub
return sheep;
}}
因為原型模式涉及到了深拷貝和淺拷貝,所以小結一下關於我對這方面的理解。
簡單來說,淺拷貝會直接進行值傳遞,也就是將屬性值複製乙份給新的物件。
對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類的物件等,那麼淺拷貝會進行引用傳遞,也就是只是將該成員變數的引用值(記憶體位址)複製乙份給新的物件。
值得注意的是,因為實際上兩個物件的該成員變數都指向同乙個例項,在這種情況下,在乙個物件中修改該成員變數會影響到另乙個物件的該成員變數值。
簡單來說,深拷貝會複製物件的所有基本資料型別的成員變數值。
深拷貝會為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變數所引用的物件。
也就是說,物件進行深拷貝要對整個物件進行拷貝。
重寫clone方法實現深拷貝。
@override
protected object clone()
throws clonenotsupportedexception
物件序列化實現深拷貝。
public object deepclone()
catch
(exception e)
finally
catch
(exception e2)
}}
建立新的物件比較複雜時,可以利用原型模式簡化建立的過程。
如果原始物件發生了變化,比如增加或減少了屬性,那麼其他clone的物件也會發生相應的變化而不需要改**。
值得注意的是,需要為每乙個全新的類配置乙個clone方法,但對已存在的類進行改造時,就違背了ocp原則了。
附:
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...