天天看點

ios--設計模式--單例模式1 前言2 詳述3 結語

1 前言

  在程式開發過程中,我們總會遇到一些情況,要求我們有一個類隻有一個執行個體,這種情況下,我們就需要使用單例模式。今天我們就來學習一下這個模式。

  轉載請注明出處:http://blog.csdn.net/developer_zhang

2 詳述

2.1 定義

  確定一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。

ios--設計模式--單例模式1 前言2 詳述3 結語

單例模式應該是23種設計模式中最簡單的一種模式了。它有以下幾個要素:

  • 私有的構造方法
  • 指向自己執行個體的私有靜态引用
  • 以自己執行個體為傳回值的靜态的公有的方法

單例模式根據執行個體化對象時機的不同分為兩種:一種是餓漢式單例,一種是懶漢式單例。餓漢式單例在單例類被加載時候,就執行個體化一個對象交給自己的引用;而懶漢式在調用取得執行個體方法的時候才會執行個體化對象。

2.2 單例模式的優點

  • 在記憶體中隻有一個對象,節省記憶體空間。
  • 避免頻繁的建立銷毀對象,可以提高性能。
  • 避免對共享資源的多重占用。
  • 可以全局通路。

2.3 适用場景

由于單例模式的以上優點,是以是程式設計中用的比較多的一種設計模式。我總結了一下我所知道的适合使用單例模式的場景:

  • 需要頻繁執行個體化然後銷毀的對象。
  • 建立對象時耗時過多或者耗資源過多,但又經常用到的對象。
  • 有狀态的工具類對象。
  • 頻繁通路資料庫或檔案的對象。
  • 以及其他我沒用過的所有要求隻有一個對象的場景。

2.4 單例模式注意事項

  • 不要做斷開單例類對象與類中靜态引用的危險操作。
  • 多線程使用單例使用共享資源時,注意線程安全問題。

2.5 代碼執行個體

在IOS中單例模式最常見的隻有懶漢模式。根據線程安全的實作來區分,一種是使用@synchronized,另一種是使用GCD的dispatch_once函數。

要實作單例,首先需要一個static的指向類本身的對象,其次需要一個初始化類函數。下面是兩種實作的代碼。

2.5.1 @synchronized

  1.  //synchronized方式單例  
  2. +(SingletonModel*)shareInstance  
  3. {  
  4.     @synchronized(self){  
  5.         if (singleton==nil) {  
  6.             singleton = [[SingletonModel alloc] init];  
  7.         }  
  8.     }  
  9.     return singleton;  
  10. }  

2.5.2 GCD

  1. //GCD方式  
  2. +(SingletonModel*)shareInstance  
  3. {  
  4.     static dispatch_once_t onceToken;  
  5.     dispatch_once(&onceToken,^{  
  6.         singleton = [[SingletonModel alloc] init];  
  7.     });  
  8.     return singleton;  
  9. }  

總的來說,兩種實作效果相同,但第二種GCD的實作方式寫起來比較簡單。如果不習慣GCD的方式,可以使用第一種方式。

3 結語

  以上是所有内容,希望對大家有所幫助。

  代碼下載下傳位址:http://download.csdn.net/detail/u010013695/6955121