先想一下既然要建立新的例項,為什麼不直接使用 new ***(),而要設計出乙個原型模式進行例項的複製呢?
這是因為:
有的時候,我們也會在不指定類名的前提下生成例項,例如像圖形編輯器中拖動現有的模型工具製作圖形的例項,這種是非常典型的生成例項的過程太過複雜,很難根據類來生成例項場景,因此需要根據現有的例項來生成新的例項。
原型設計模式主要分為深轉殖和淺轉殖。
淺轉殖 vs 深轉殖
clone() 方法使用的是淺轉殖。淺轉殖對於要轉殖的物件, 會複製其基本資料型別和 string 型別的屬性的值給新的物件. 而對於非基本資料型別的屬性,例如陣列、集合, 僅僅複製乙份引用給新產生的物件, 即新產生的物件和原始物件中的非基本資料型別的屬性都指向的是同乙個物件。
此外,還存在深轉殖。深轉殖對於要轉殖的物件, 對於非基本資料型別的屬性,例如陣列、集合支援複製。換句話說,在深轉殖中,除了物件本身被複製外,物件所包含的所有成員變數也將複製。
淺轉殖和深轉殖的主要區別在於,是否支援引用型別的成員變數的複製。。
淺轉殖的實現分為三點:
1.將該類實現clonable介面;
2.並覆蓋object的clone方法,設定為public關鍵字,原方法為protected;
3.在clone()中呼叫super.clone();
**內容比較簡單就不貼了,
深轉殖主要分為兩種實現:
第一種是通過序列化,將物件寫入物件流再讀出生成物件即可完成深轉殖。
第二種就是在重寫的方法對於每個引用物件(即基本型別和string型別以外)的引用繼續初始化或者叫單獨轉殖,即可完成深轉殖。
1.改寫clone方法完成深轉殖
/**
* @author jay
* @date 2020/7/14 17:09
* @description:
*/public
class
shallowprototype
implements
cloneable
public
void
setname
(string name)
public son getson()
public
void
setson
(son son)
@override
protected object clone()
throws clonenotsupportedexception
return
super
.clone()
;}}
2.通過序列化完成深轉殖
bytearrayoutputstream byteout=
newbytearrayoutputstream()
; objectoutputstream outputstream=
newobjectoutputstream
(byteout)
; outputstream.
writeobject
(prototype)
;//讀出物件;
bytearrayinputstream bytein=
newbytearrayinputstream
(byteout.
tobytearray()
);objectinputstream inputstream=
newobjectinputstream
(bytein)
; shallowprototype prototype2 =
(shallowprototype) inputstream.
readobject()
; inputstream.
close()
; bytein.
close()
; outputstream.
close()
; byteout.
close()
;
設計模式 原型設計模式
建立型的模式,最後一種原型設計模式。是一種使用起來簡單,可以配合單例模式或是工廠設計模式使用的。先看一下,原型設計模式是怎麼回事兒吧。如果想使用原型設計模式。必須滿足乙個條件,首先實現cloneable介面,然後重寫clone方法。這樣就算是完成了,然後就開始測試了 建立完物件以後給phone乙個當...
設計模式學習 原型
來自 設計模式 可復用物件導向軟體的基礎 目的用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。class mazeprototypefactory public mazefactory mazeprototypefactory mazeprototypefactory maze m,...
python 設計模式 原型模式 原型設計模式
原型設計模式有助於隱藏該類建立例項的複雜性,在物件的概念將與從頭建立的新物件的概念不同。如果需要,新複製的物件可能會在屬性中進行一些更改。這種方法節省了開發產品的時間和資源。如何實現原型模式?現在讓我們看看如何實現原型模式。實現如下 import copy class prototype type ...