概念: 是一種建立型設計模式,它通過複制一個已經存在的執行個體來傳回新的執行個體,而不是建立執行個體。被複制的執行個體就是我們所稱的原型。
原型模式的拷貝:分為"淺拷貝"和"深拷貝"。(這個和我們了解的拷貝是一樣的)
淺拷貝: 對值類型的成員變量進行值的複制,對引用類型的成員變量隻複制引用,不複制引用的對象.
深拷貝: 對值類型的成員變量進行值的複制,對引用類型的成員變量也進行引用對象的複制.
原型模式涉及到三個角色:
(1)客戶(client)角色:客戶類提出建立對象的請求。
(2)抽象原型(prototype)角色:這是一個抽象角色,通常由一個java接口或java抽象類實作。此角色給出所有的具體原型類所需的接口。
(3)具體原型(concrete prototype)角色:被複制的對象。此角色需要實作抽象的原型角色所要求的接口。
用uml圖表示就是:
那麼根據上面的描述,我們通過代碼來加深了解。首先我們需要建立三個角色,分别是上面的抽象原型,具體原型,客戶。
抽象原型:
具體原型:
用戶端:
這是最簡單的克隆方式,被拷貝的對象沒有任何的屬性。
下面看一下登記形式的原型模式,它多了一個原型管理器(prototypemanager)角色,該角色的作用是:建立具體原型類的對象,并記錄每一個被建立的對象。
來看代碼實作上有什麼不同,
抽象原型角色:
具體原型角色:
原型管理器角色保持一個聚集,作為對所有原型對象的登記,這個角色提供必要的方法,供外界增加新的原型對象和取得已經登記過的原型對象。
用戶端測試:
如果需要建立的原型對象數目較少而且比較固定的話,可以采取第一種形式。在這種情況下,原型對象的引用可以由用戶端自己儲存。
如果要建立的原型對象數目不固定的話,可以采取第二種形式。在這種情況下,用戶端不儲存對原型對象的引用,這個任務被交給管理者對象。在複制一個原型對象之前,用戶端可以檢視管理者對象是否已經有一個滿足要求的原型對象。如果有,可以直接從管理者類取得這個對象引用;如果沒有,用戶端就需要自行複制此原型對象。