原型模式(prototype pattern)是 建立型模式 的一種,其特點在於通過「複製」乙個已經存在的例項來返回新的例項,而不是新建例項。被複製的例項就是我們所稱的「原型」,這個原型是可定製的。
類初始化消耗資源較多
new產生的物件需要比較繁瑣的過程
建構函式比較複雜
迴圈體內產生大量的物件
建立基礎concreteprototype,它實現了prototype
的clone()
。
public
class
concreteprototype
implements
prototype
public
void
setage
(int age)
public list gethobbis()
public
void
sethobbis
(list hobbis)
@override
public prototype clone()
}
建立測試類,檢視複製結果。
public
class
test
}
可以看出,我們確實複製了乙個新的類。但是hobbies的應用位址卻是相同的,意味著我們複製的並不是值,而是引用的位址。這就是我們常說的淺轉殖。
淺轉殖我們使用孫悟空的作為模型。猴哥猴哥,你真了不得,拔一根毫毛吹出猴萬個,但是每只猴子都有個金箍棒,而這個金箍棒的複製應該就屬於深轉殖。接下來我們實現一下。複製出來的物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。
深轉殖複製出來的所有變數都含有與原來的物件相同的值,那些引用其他物件的變數將指向複製出來的新物件,而不再是原有的那些被引用的物件。換言之,深複製把要複製的物件所引用的物件都複製了一遍。
首先建立乙個可序列化的金箍棒
public
class
jingubang
implements
serializable
再建立乙個悟空
public
class
wukong
implements
cloneable
, serializable
public
intgetheight()
public
void
setheight
(int height)
public
intgetweight()
public
void
setweight
(int weight)
public jingubang getjingubang()
public
void
setjingubang
(jingubang jingubang)
@override
protected object clone()
throws clonenotsupportedexception
public wukong deepclone()
catch
(ioexception e)
catch
(classnotfoundexception e)
}}
使用序列化複製生成例項。
public
class
wukongtest
catch
(clonenotsupportedexception e)
system.out.
println
(sunweukong.
getjingubang()
);system.out.
println
(liuermihou.
getjingubang()
);system.out.
println
("轉殖物件引用位址"
+(sunweukong == liuermihou));
system.out.
println
("轉殖屬性引用位址"
+(sunweukong.
getjingubang()
== liuermihou.
getjingubang()
));}
}
由測試可以看出,我們複製生成的例項,已經完全是全新的例項了。 設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...