1 前言
在許多面向對象的應用程序中,有些對象的創建代價過於大或者過於復雜。要是可以重建相同的對象並作輕微的改動,事情會容易許多。我們可以通過輕微的改動重用已有的對象,以適應程序中的特定情況。今天我們就來學習一下該模式。
2 詳述
2.1 定義
應用於“復制”操作的模式成為原型(Prototype)模式。復制(cloning)指用同一模具生產一系列的產品。模具所基於的物品稱為原型。盡管產品是用同一模具復制的,但是某些屬性,如顏色與尺寸,可以稍有不同,但是他們還是屬於同一類。
2.2 何時是用原型模式
(1)需要創建的對象應獨立於其類型與創建方式。
(2)要實例化的類是在運行時決定的。
(3)不想要與產品層次相對應的工廠層次。
(4)不同類的實例間的差異僅是狀態的若干組合。因此復制相應數量的原型比手工實例化更加方便。
(5)類不容易創建,比如每個組件可以把其他組件作為子節點的組合對象。復制已有的組合對象並對副本進行修改會更加容易。
此模式的最低限度是生成對象的真實副本,以用作同一環境下其他相關事物的基礎(原型)。
2.3 淺復制與深復制
如果對象有個指針型成員變量指向內存中的某個資源,那麼如果復制這個對象呢?指針只是存儲內存中資源地址的占位符。如果復制操作中,只是將指針復制給新對象(副本),那麼底層的資源是架上仍然由兩個實例在共享。
因此只復制了指針而不是實際資源,這成為淺復制。
深復制是指不僅復制指針值,還復制指針所指向的資源。不只是簡單的復制資源指針,還要生成內存中實際資源的真正副本。因此副本對象的指針指向了內存中不同位置的統一資源(內容)的副本。
2.4Cocoa Touch框架中的對象復制
CocoaTouch框架為NSObject的派生類提供了實現深復制的協議。NSObject的子類需要實現NSCopying協議及其方法--(id)copyWithZone:(NSZone *)zone。NSObject有一個實例方法叫做(id)copy。默認的copy方法調用[selfcopyWithZone:nil]。對於采納了NSCopying協議的子類,需要實現這個方法,否則將引發異常。IOS中,這個方法保持新的副本對象,然後將其返回。此方法的調用者需要負責釋放返回的對象。
深復制的技巧在於:保證確實復制了內存中的資源,而不只是指指針。
3 結語
以上是所有內容,希望對大家有所幫助。