天天看點

設計模式--單例模式

單例模式(singleton)

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

單例模式的類圖如下:

設計模式--單例模式

單例模式

單例模式幾乎是設計模式的最簡單形式了,這一模式的意圖是使得類的一個對象成為系統中的唯一執行個體。要實作這一點,可以從用戶端對其進行執行個體化開始。是以需要一種隻允許生成對象類的唯一執行個體的機制,“阻止”所有想要生成對象的通路。我們可以用工廠方法來限制執行個體化的過程。這個方法應該為靜态方法(類方法),因為我們讓類的執行個體去生成另一個唯一執行個體毫無意義。

static uniqueInstance

Singleton

的唯一執行個體,

static sharedInstance

将它傳回給用戶端。通常,

sharedInstance

會檢查

uniqueInstance

是否已經被執行個體化,如果沒有,它會生成一個執行個體後傳回

uniqueInstance

何時使用原型模式?

在以下情形,會考慮使用原型模式:
  1. 類隻有一個執行個體,而且必須從一個為人熟知的通路點對其進行通路,比如工廠方法;
  2. 這個唯一執行個體隻能通過子類化進行擴充,而且擴充的對象不會破壞用戶端代碼。

使用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

繼續閱讀