原型模式 Prototype

2022-09-03 04:39:10 字數 1807 閱讀 7381

原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

它主要面對的問題是:「某些結構複雜的物件」的建立工作;由於需求的變化,這些物件經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的介面。

下面我轉殖乙個類,並修改名字和年齡,看看有什麼變化

package

com.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方法也要相應的改一下

@override

protected 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章了...