設計模式 原型模式 拔一根毫毛吹出猴萬個

2021-09-16 01:20:50 字數 2379 閱讀 8619

原型模式(prototype pattern)是 建立型模式 的一種,其特點在於通過「複製」乙個已經存在的例項來返回新的例項,而不是新建例項。被複製的例項就是我們所稱的「原型」,這個原型是可定製的。

類初始化消耗資源較多

new產生的物件需要比較繁瑣的過程

建構函式比較複雜

迴圈體內產生大量的物件

建立基礎concreteprototype,它實現了prototypeclone()

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 有些時候我們想要...