原型模式(prototype)
原型模式最初的定義出現(xiàn)于《設(shè)計(jì)模式》(Addison-Wesley,1994)
原型模式:使用原型實(shí)例指定創(chuàng)建對象的種類。并通過復(fù)制這個(gè)原型創(chuàng)建新的對象伦忠。
原型模式的類圖如下:
原型模式是一種非常簡單的設(shè)計(jì)模式滋早。客戶端知道抽象Prototype類,在運(yùn)行時(shí)夭委,抽象Prototype子類的任何對象都可以按客戶端的意愿被復(fù)制。因此募强,無需手工創(chuàng)建就可以制造同意類型的多個(gè)實(shí)例株灸。
Prototype聲明了復(fù)制自身的接口。作為Prototype的子類钻注,ConcretePrototype實(shí)現(xiàn)了Concrete復(fù)制自身的clone操作蚂且。
這里,客戶端通過請求原型復(fù)制其自身幅恋,創(chuàng)建了一個(gè)新的對象杏死。
何時(shí)使用原型模式?
在以下情形捆交,會(huì)考慮使用原型模式:
- 需要?jiǎng)?chuàng)建的對象獨(dú)立于其類型與創(chuàng)建的方式淑翼;
- 實(shí)例化的類是在運(yùn)行時(shí)決定的;
- 不想要與產(chǎn)品層次相對應(yīng)的工廠層次品追;
- 不同類的實(shí)例間的差異僅是狀態(tài)的若干組合玄括,這樣復(fù)制相應(yīng)數(shù)量的原型比手工實(shí)例化更加方便;
- 類不容易創(chuàng)建肉瓦,比如每個(gè)組件可把其他組件作為子節(jié)點(diǎn)的組合對象遭京,復(fù)制已有的組合對象并對副本進(jìn)行修改會(huì)更加容易胃惜。
使用Cocoa Touch框架中的對象復(fù)制
值得注意的是:淺復(fù)制與深復(fù)制的區(qū)別
淺復(fù)制只是復(fù)制了對象的指針,而同時(shí)指向相同的對象資源哪雕,也就是說只是復(fù)制了棧里面的內(nèi)容船殉,而同時(shí)指向相同的堆空間。改變其對象值得時(shí)候斯嚎,復(fù)制對象間會(huì)相互影響利虫。
深復(fù)制是同時(shí)復(fù)制對象的指針跟對象本身,也就是同時(shí)復(fù)制了堆棻てВ空間的內(nèi)容糠惫。
Cocoa Touch框架為NSObject
的派生類提供了實(shí)現(xiàn)深復(fù)制的協(xié)議。NSObject
的子類需要實(shí)現(xiàn)NSCopying
協(xié)議及其方法-(id)copyWithZone:(NSZone *)zone
钉疫。NSObject
有一個(gè)實(shí)例方法叫-(id)copy
硼讽。默認(rèn)的copy
方法調(diào)用[self copyWithZone:nil]
。對于采納了NSCopying
協(xié)議的子類陌选,需要實(shí)現(xiàn)這個(gè)方法理郑。否則將引發(fā)異常。iOS中咨油,這個(gè)方法保持新的副本對象您炉,然后將其返回。
附上原型模式的Demo:DesignPattern_Prototype
喜歡我的可以關(guān)注收藏我的個(gè)人博客:RobberJJ