單例模式(singleton)
單例模式最初的定義出現于《設計模式》(Addison-Wesley,1994)
單例模式:保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。
單例模式的類圖如下:

單例模式
單例模式幾乎是設計模式的最簡單形式了,這一模式的意圖是使得類的一個對象成為系統中的唯一執行個體。要實作這一點,可以從用戶端對其進行執行個體化開始。是以需要一種隻允許生成對象類的唯一執行個體的機制,“阻止”所有想要生成對象的通路。我們可以用工廠方法來限制執行個體化的過程。這個方法應該為靜态方法(類方法),因為我們讓類的執行個體去生成另一個唯一執行個體毫無意義。
static uniqueInstance
是
Singleton
的唯一執行個體,
static sharedInstance
将它傳回給用戶端。通常,
sharedInstance
會檢查
uniqueInstance
是否已經被執行個體化,如果沒有,它會生成一個執行個體後傳回
uniqueInstance
。
何時使用原型模式?
在以下情形,會考慮使用原型模式:
- 類隻有一個執行個體,而且必須從一個為人熟知的通路點對其進行通路,比如工廠方法;
- 這個唯一執行個體隻能通過子類化進行擴充,而且擴充的對象不會破壞用戶端代碼。
使用Cocoa Touch架構中使用單例模式
Cocoa Touch架構中使用了大量的單例類。下面讨論其中的幾個:
1.UIApplication類
架構中使用最常用的一個類是
UIApplication
類。它提供了一個控制并協調iOS應用程式的集中點。
每個應用程式有且僅有一個
UIApplication
的執行個體。它由
UIApplicationMain
函數在應用程式啟動時建立為單例對象。之後,對同一
UIApplication
執行個體可以通過其sharedApplication類方法進行通路。
UIApplication
對象為應用程式處理許多記憶體管理任務(housekepping task),包括傳入事件的最初路由,以及為
UIControl
分發動作消息給核實的目标對象。它還維護應用程式中的所有
UIWindow
對象的清單。。應用程式對象總是被配置設定一個
UIApplicationDelegate
對象,應用程式将把重要的運作時狀态通知給它,比如iOS應用程式中的應用程式啟動、記憶體不足警告、應用程式終止和背景進行執行。這讓委托(
delegate
)有機會做出适當的響應。
2.UIAcceleremeter類
Cocoa Touch架構中另一個常用的單例是
UIAcceleremeter
.
UIAcceleremeter
讓應用程式可以注冊,以接收來自iOS裝置内置的加速度計的加速度的相關資料。應用程式會收到三維空間中沿主軸的線性加速度變化,可以使用這一資料檢測裝置的目前方向和目前方向的瞬間變化。
UIAcceleremeter
是單例,是以不能直接生成它的對象。而是應該調用其
sharedAcceleremeter
單例類方法以通路它的唯一執行個體。然後設定它的
updateInterval
屬性,并用自己的
delegate
對象設定
delegate
屬性,以接收來自單例執行個體的加速度資料。
3.NSFileManager類
在Mac OS X v10.5和iOS2.0之前,
NSFileManager
曾經是單例模式的“嚴格”實作。調用它的init方法是空操作,并且唯一執行個體可以通過
defaultManager
類方法建立和通路。然而其單例實作并不是線程安全的。現在推薦生成新的
NSFileManager
執行個體以保證線程安全。這一方式被認為是更靈活的單例實作,其中工廠方法總是傳回同一執行個體,但是也可以配置設定并初始化另外的執行個體。
喜歡我的可以關注收藏我的個人部落格:
RobberJJ附上單例模式的Demo:
DesignPattern_Singleton