小唐說設計模式 原型模式

2021-10-06 08:58:44 字數 3183 閱讀 9789

原型模式(prototype pattern)是五種建立型模式的其中一種,用原型例項指定建立物件的種類作為原型,並且通過拷貝原型來建立新的物件。

新建乙個物件有時候會很麻煩,可能涉及大量的變數初始化,函式、**塊的執行,不僅浪費資源,還會涉及資料準備、訪問許可權等操作。

原型模式至少涉及兩個角色:

public

class

prototype

implements

cloneable

}public

class

client

}

為了**其中的一些細節,我們對上面的**稍微新增一些細節部分:

public

class

prototype

implements

cloneable

public

prototype

(string name)

@override

public object clone()

throws clonenotsupportedexception

public string getname()

public

void

setname

(string name)

@override

public string tostring()

}public

class

client

}

在prototype類中加入了建構函式,重寫了tostring(),執行main(),結果如下:

empty constructor--

----

----

----

----

--com.company.prototype@4554617c

111com.company.prototype@74a14482

111com.company.prototype@4554617c

111com.company.prototype@74a14482

222

可以看出:

建構函式只執行了一次,說明複製原型類的物件並不需要執行建構函式;

原物件和複製物件的位址不同,說明是重新建立的;

目前看來,在複製完成之後,複製的物件似乎和原物件就沒有關係了,原物件的改變不會影響複製的物件,複製的物件改變也不會影響原物件。

真的是這樣嗎?

我們修改一下**:

public

class

carpublic

car(string color)

public string getcolor()

public

void

setcolor

(string color)

}public

class

prototype

implements

cloneable

public

prototype

(string name)

public

prototype

(string name, car car)

@override

public object clone()

throws clonenotsupportedexception

public string getname()

public

void

setname

(string name)

public car getcar()

public

void

setcar

(car car)

@override

public string tostring()

}public

class

client

}

執行結果:

empty constructor--

----

----

----

----

--com.company.prototype@4554617c

111 red car com.company.car@74a14482

com.company.prototype@1540e19d

111 red car com.company.car@74a14482

com.company.prototype@4554617c

111 red car com.company.car@74a14482

com.company.prototype@1540e19d

222 yel car com.company.car@677327b6

可以看過結果中第4行和第5行,car的顏色和位址都不一樣,我幾乎可以得出結論它們確實不是乙個物件了,但是這樣寫其實是有漏洞的,我通過setcar()是顯式地改變了這個物件,不能正確得出結論。

再將輸出改一下:

public

class

client

}

結果變為:

empty constructor--

----

----

----

----

--com.company.prototype@4554617c

111 red car com.company.car@74a14482

com.company.prototype@1540e19d

111 red car com.company.car@74a14482

com.company.prototype@4554617c

111 black car com.company.car@74a14482

com.company.prototype@1540e19d

222 black car com.company.car@74a14482

所有的car物件的位址都是同乙個,顏色值也一同改變,說明clone()實現的是淺拷貝。

如果想對引用型別也實現深拷貝,可以採用二進位製流讀寫等操作實現,此處不再詳述。

小唐說設計模式 策略模式篇

當我們的 現了一連串的if else 或者是switch case 語句時,我們的 體就會很長很臃腫,閱讀性大大下降,此時可採用策略模式進行重構。策略模式利用的是物件導向語言的三個特性,尤其是繼承和多型。首先讓多個類繼承同乙個抽象的父類或者是實現乙個介面,在抽象類或者介面中宣告我們要實現的抽象方法,...

簡說原型模式

在原型模式下,我們在原型別下實現clone方法,通過呼叫本地辦法,實現原型別的複製。也就是說,新物件的建立,不在通過new的形式了,而是在底層通過位元組流的複製建立。當然,這其中有以下幾點需要特別注意 1 原型模式建立物件是不會呼叫構造方法的,這就跟單例模式有了衝突。2 原型模式建立物件的時候,涉及...

設計模式 原型模式

1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...