Cocoa cola——Cocoa Framework之單例模式,cocoacola
Singleton(單例模式),也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只用一個執行個體存在。許多時候整個系統只需要擁有一個全域對象,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,改伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象擷取這些配置資訊。這種方式簡化了再複雜環境下的組態管理。
實現單例模式的思路是,一個類能返回對象一個執行個體(永遠是同一個)和一個獲得該執行個體的方法(必須是靜態方法,通常使用getInstance這個名稱);當我們調用這個方法時,如果類持有的執行個體不為空白,就返回這個執行個體;如果類保持的執行個體為空白,就建立該類的執行個體,並將執行個體賦予該類保持的執行個體,從而限制使用者只有通過該類提供的靜態方法來得到該類的唯一執行個體。
單例模式在多線程的應用場合下必須小心使用。當唯一執行個體尚未建立時,如果有兩個線程同時調用建立方法,那麼它們同時沒有檢測到唯一執行個體的存在,從而同時各自建立了一個執行個體,這樣就又兩個執行個體被構造出來,從而違反了單例模式中執行個體唯一的原則。解決這個問題的方法是為標記類是否已經執行個體化的變數提供一個互斥鎖(雖然這樣會降低效率)。
在Objective-C中建立一個單例方法的步驟如下。
步驟1 為你的單例類聲明一個靜態執行個體,並且初始化它的值為nil。步驟2 在擷取執行個體的方法中(比如例子中的getClassA),只有在靜態執行個體為nil的時候,產生一個類的執行個體,這個執行個體通常被稱為共用的執行個體。步驟3 重寫allocWithZone方法,用於確定:不能夠使用其他的方法建立我們類的執行個體,限制使用者只能通過擷取執行個體的方法得到這個類的執行個體。所以,我們在allocWithZone方法中直接返回共用的類執行個體。步驟4 實現基本的協議方法copyWithZone、release、retain、retainCount和autorelease,用於保證單例具有一個正確的狀態。最後四中方法是用於記憶體管理代碼,並不適用於垃圾收集代碼。
範例程式碼如下:
@implementation Singletonstatic Singleton *singleton=nil;+(Singleton*) getInstance{ if (singleton==nil) { singleton=[[super allocWithZone:NULL]init]; } return singleton;}@end