原型模式(prototype)
原型模式最初的定義出現于《設計模式》(Addison-Wesley,1994)
原型模式:使用原型執行個體指定建立對象的種類。并通過複制這個原型建立新的對象。
原型模式的類圖如下:

原型模式類圖
原型模式是一種非常簡單的設計模式。用戶端知道抽象Prototype類,在運作時,抽象Prototype子類的任何對象都可以按用戶端的意願被複制。是以,無需手工建立就可以制造同意類型的多個執行個體。
Prototype聲明了複制自身的接口。作為Prototype的子類,ConcretePrototype實作了Concrete複制自身的clone操作。
這裡,用戶端通過請求原型複制其自身,建立了一個新的對象。
何時使用原型模式?
在以下情形,會考慮使用原型模式:
- 需要建立的對象獨立于其類型與建立的方式;
- 執行個體化的類是在運作時決定的;
- 不想要與産品層次相對應的工廠層次;
- 不同類的執行個體間的差異僅是狀态的若幹組合,這樣複制相應數量的原型比手工執行個體化更加友善;
- 類不容易建立,比如每個元件可把其他元件作為子節點的組合對象,複制已有的組合對象并對副本進行修改會更加容易。
使用Cocoa Touch架構中的對象複制
值得注意的是:淺複制與深複制的差別
淺複制隻是複制了對象的指針,而同時指向相同的對象資源,也就是說隻是複制了棧裡面的内容,而同時指向相同的堆空間。改變其對象值得時候,複制對象間會互相影響。
深複制是同時複制對象的指針跟對象本身,也就是同時複制了堆棧空間的内容。
Cocoa Touch架構為
NSObject
的派生類提供了實作深複制的協定。
NSObject
的子類需要實作
NSCopying
協定及其方法
-(id)copyWithZone:(NSZone *)zone
。
NSObject
有一個執行個體方法叫
-(id)copy
。預設的
copy
方法調用
[self copyWithZone:nil]
。對于采納了
NSCopying
協定的子類,需要實作這個方法。否則将引發異常。iOS中,這個方法保持新的副本對象,然後将其傳回。
附上原型模式的Demo:
DesignPattern_Prototype喜歡我的可以關注收藏我的個人部落格:
RobberJJ