原型模式(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.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...