單例模式確定為一個确定的類隻有一個執行個體存在,而且有一個全局的通路指針隻想它,他經常使用延時加載去在第一次使用的時候建立一個簡單的執行個體。
小貼士:蘋果使用這個方法很頻繁。比如:[nsuserdefaults standaruserdefaults],
[uiapplicationsharedapplication],[uiscreen mainscreen],[nsfilemanager
defaultmanager],都傳回一個單例。
你可能會以為為什麼你會介意一個類周圍會有不止一個執行個體,代碼和記憶體都很簡化,對不對?
有一些情況下一個類隻有一個執行個體會很有意義。比如:沒有必要去有很多的logger執行個體,除非你想要同時寫入幾個日記檔案,或者,擁有一個全聚德配置控制的類,很容易就實作一個線程安全的單個共享資源,比如配置檔案,而不是多個類同時修改同一個配置檔案。
看一下右邊的這個圖表:
它顯示了一個logger類隻有一個屬性,(也是一個執行個體),和兩個方法init和sharedinstance;
第一次用戶端發送sharedinstance消息,這和屬性的執行個體還沒有初始化,是以你要建立這個類的一個新的執行個體然後傳回一個指針指向它。
下一次你調用sharedinstance方法,執行個體就會立馬傳回而不需要任何的初始化,這個邏輯保證任何時候都隻有一個執行個體存在。
你将要實作這和模式通過建立一個單例的類去管理所有的album 資料。
你将會意識到在這個組中有一個叫做api的租在這個工程中,這是你将會将所有的提供給你的app服務的類放到其中。在這個組中建立一個叫做libraryapi的類,繼承于nsobject。
打開libraryapi.h,加入以下方法:
+(libraryapi*)sharedinstance;
在libraryapi.m中加入這些方法:
這個簡單的方法中有很多内容:
1. 定義了一個靜态變量去hold住類中的執行個體,確定它是全局可用的在你的類中。
2. 定義了一個靜态變量dispatch_once_t類型的去確定這個初始化代碼隻執行一次。
3. 使用grand central dispatch(gcd)去執行一個初始化libraryapi的執行個體的block,這就是單例設計模式的本質:這個初始化永遠不會再次被調用一旦這個類被執行個體化。
下次你調用sharedinstance方法是,這個dispatch_once裡面的block代碼不會被執行了,你會得到一個先前建立這個libraryapi的一個引用。
現在你有了一個單例對象作為albums的入口指針,更進一步去建立一個類去處理庫中資料的持久化。
在api組中建立一個persistencymanager的繼承于nsobject的類。打開它的.h檔案,加入
#import “album.h”再加入以下代碼:
以上是加入了三個方法去處理資料的。
打開.m檔案在 @implemetation的上方加入這些代碼:
上面的代碼添加了一個類擴充,這是另一個添加私有變量和方法帶類中是以外部的類并不隻帶他們,在這裡,你聲明了一個可變數組去hold住album的資料,這個資料是可變的以便你可以輕松地添加和删除專輯。
現在添加下面代碼到persistencymanager.m中去
在init這個初始化函數中你用五個執行個體轉會填充了這個數組,其他幾個方法允許你去得到,添加額删除albums。編譯你的工程確定仍能正确編譯。
在這個時候你可能會疑問為什麼persistencemanager不是單例,它和libraryapi的關系會下下一部分的外觀(faade)設計模式中見到。