1 前言
在程式開發過程中,我們總會遇到一些情況,要求我們有一個類隻有一個執行個體,這種情況下,我們就需要使用單例模式。今天我們就來學習一下這個模式。
轉載請注明出處:http://blog.csdn.net/developer_zhang
2 詳述
2.1 定義
確定一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。
單例模式應該是23種設計模式中最簡單的一種模式了。它有以下幾個要素:
- 私有的構造方法
- 指向自己執行個體的私有靜态引用
- 以自己執行個體為傳回值的靜态的公有的方法
單例模式根據執行個體化對象時機的不同分為兩種:一種是餓漢式單例,一種是懶漢式單例。餓漢式單例在單例類被加載時候,就執行個體化一個對象交給自己的引用;而懶漢式在調用取得執行個體方法的時候才會執行個體化對象。
2.2 單例模式的優點
- 在記憶體中隻有一個對象,節省記憶體空間。
- 避免頻繁的建立銷毀對象,可以提高性能。
- 避免對共享資源的多重占用。
- 可以全局通路。
2.3 适用場景
由于單例模式的以上優點,是以是程式設計中用的比較多的一種設計模式。我總結了一下我所知道的适合使用單例模式的場景:
- 需要頻繁執行個體化然後銷毀的對象。
- 建立對象時耗時過多或者耗資源過多,但又經常用到的對象。
- 有狀态的工具類對象。
- 頻繁通路資料庫或檔案的對象。
- 以及其他我沒用過的所有要求隻有一個對象的場景。
2.4 單例模式注意事項
- 不要做斷開單例類對象與類中靜态引用的危險操作。
- 多線程使用單例使用共享資源時,注意線程安全問題。
2.5 代碼執行個體
在IOS中單例模式最常見的隻有懶漢模式。根據線程安全的實作來區分,一種是使用@synchronized,另一種是使用GCD的dispatch_once函數。
要實作單例,首先需要一個static的指向類本身的對象,其次需要一個初始化類函數。下面是兩種實作的代碼。
2.5.1 @synchronized
- //synchronized方式單例
- +(SingletonModel*)shareInstance
- {
- @synchronized(self){
- if (singleton==nil) {
- singleton = [[SingletonModel alloc] init];
- }
- }
- return singleton;
- }
2.5.2 GCD
- //GCD方式
- +(SingletonModel*)shareInstance
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken,^{
- singleton = [[SingletonModel alloc] init];
- });
- return singleton;
- }
總的來說,兩種實作效果相同,但第二種GCD的實作方式寫起來比較簡單。如果不習慣GCD的方式,可以使用第一種方式。
3 結語
以上是所有内容,希望對大家有所幫助。
代碼下載下傳位址:http://download.csdn.net/detail/u010013695/6955121