原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
它主要面對的問題是:「某些結構複雜的物件」的建立工作;由於需求的變化,這些物件經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的介面。
下面我轉殖乙個類,並修改名字和年齡,看看有什麼變化
packagecom.taobao.business;
/*** 原型模式:建立型 */
public
class
prototype
catch
(clonenotsupportedexception e)
}}/**
* 淺拷貝 */
class
ageclass
@override
public
string tostring()
}class person implements
cloneable
//修改name
public
void
setname(string name)
@override
protected object clone() throws
clonenotsupportedexception
@override
public
string tostring()
}
輸出的結果是:
原來的:姓名:張三,年齡:18
轉殖的:姓名:張三,年齡:18
修改後原來的:姓名:張三,年齡:36
修改後轉殖的:姓名:李四,年齡:36
為什麼修改了轉殖物件後,姓名改變了,但是年齡為什麼原來那個物件也改變了?而且我定義的姓名是乙個基礎型別,而年齡是自定義的型別,這說明淺轉殖是不能把複雜型別的值轉殖出來的,那麼如果解決呢?有人可能會想那把年齡那個類不要做成自定義型別不就可以了嗎?但是現實情況可能不是乙個年齡類呢?而且是乙個其它的複雜型別呢?所以這就要採用深度轉殖,把年齡類改成也實現cloneable介面。
/*** 深拷貝 */
class ageclass implements
cloneable
@override
protected object clone() throws
clonenotsupportedexception
@override
public
string tostring()
}
當然person類的clone方法也要相應的改一下
@overrideprotected object clone() throws
clonenotsupportedexception
ok,現在執行一下,看看年齡轉殖後是的引用還是把值轉殖過去了?
原來的:姓名:張三,年齡:18
轉殖的:姓名:張三,年齡:18
修改後原來的:姓名:張三,年齡:18
修改後轉殖的:姓名:李四,年齡:36
可以了!現在的自定義型別也轉殖過去了!而且把轉殖物件改了,也不會對以前的物件有其它影響。
但是當這中自定義型別中如果又包含有很多個自定義型別呢?難道把每個類都改成實現clone介面嗎?那是不是太麻煩點了?這樣的話,我們可以把物件序列化,當需要的時候再反序列化。
/*** 序列化
*/private
static object cloneobject(object obj) throws
exception
原型模式(ProtoType)
1.目的 當需要從乙個物件copy出另外乙個物件時,可以使用原型模式,本質上是呼叫的copy建構函式 與copy建構函式的區別,可能就是不需要顯示的生成物件,而是通過函式呼叫 2.prototype.h ifndef prototype h define prototype h include in...
Prototype 原型模式
prototype 原型模式 所謂原型模式,就是可以根據乙個原型,快速建立出其拷貝。如 int a 1 int b new int a a cout a endl cout b endl 輸出結果 2 1 上面就使用了原型模式。根據原型a,快速建立出了a的拷貝b。同時,b儲存了a當時的狀態。當a之後...
原型模式 Prototype
用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式是一種建立型設計模式,它允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是通過將乙個原型物件傳給那個要發動建立的物件,這個要發動的物件通過請求原型物件拷貝它們自己來實施建立。現實很殘酷,都第9章了...