單例的理解和應用

2021-07-28 13:29:58 字數 1490 閱讀 7298

[objc]view plain

copy

print?

什麼是單例呢?wikipedia是如此定義的:  

在軟體工程中,單例是一種用於實現單例的數學概念,即將類的例項化限制成僅乙個物件的設計模式。  

或者我的理解是:  

單例是一種類,該類只能例項化乙個物件。  

儘管這是單例的實際定義,但在foundation框架中不一定是這樣。比如nsfilemanger和nsnotificationcenter,分別通過它們的類方法defaultmanager和defaultcenter獲取。儘管不是嚴格意義的單例,這些類方法返回乙個可以在應用的所有**中訪問到的類的共享例項。在本文中我們也會採用該方法。  0.6

和ios4.0

),他們也引入了乙個很適合用於實現單例模式的函式。  

該函式就是dispatch_once:  

void

dispatch_once( 

dispatch_once_t

*predicate, dispatch_block_t block);  

該函式接收乙個dispatch_once用於檢查該**塊是否已經被排程的謂詞(是乙個長整型,實際上作為bool

使用)。它還接收乙個希望在應用的生命週期內僅被排程一次的**塊,對於本例就用於shared例項的例項化。  

dispatch_once不僅意味著**僅會被執行一次,而且還是執行緒安全的,這就意味著你不需要使用諸如@synchronized

之類的來防止使用多個執行緒或者佇列時不同步的問題。  

如果被多個執行緒呼叫,該函式會同步等等直至**塊完成。  

實際要如何使用這些呢?  

好吧,假設有乙個accountmanager類,你想在整個應用中訪問該類的共享例項。你可以按如下**簡單實現乙個類方法:  

+ (accountmanager

*)sharedmanager );  

return

sharedaccountmanagerinstance;   

}  這就意味著你任何時候訪問共享例項,需要做的僅是:  

accountmanager

*accountmanager = [accountmanager

sharedmanager

];  

就這些,你現在在應用中就有乙個共享的例項,該例項只會被建立一次。  

該方法有很多優勢:   

1執行緒安全  

2很好滿足靜態分析器要求  

3和自動引用計數(arc)相容   

4僅需要少量**  

該方法的劣勢就是它仍然執行建立乙個非共享的例項:  

accountmanager

*accountmanager = [[accountmanager

alloc

]init

];  

有些時候你希望有這種行為,但如果正在想要的是僅乙個例項被例項化就需要注意這點。

單例模式的理解和示例

確保乙個類只有乙個例項,並提供乙個全域性訪問點 一般分類兩大類 餓漢模式 懶漢模式 餓漢模式,執行緒安全,但預設就建立例項,占用空間 public class singleton1 public static singleton1 getintance 用空間換時間,預設就建立例項,所以沒有執行緒安...

單例模式的寫法和應用

眾多設計模式中,單例模式比較常見的一種,面試和工作中也會經常接觸到。本文以乙個 c 開發者的角度來 單例模式幾種典型實現。設計模式經典 gof定義的單例模式需要滿足以下兩個條件 1.保證乙個類只建立乙個例項。2.提供對該例項的全域性訪問點。如果系統有類似的實體 有且只有乙個,且需要全域性訪問 那麼就...

單例和工廠模式應用

單例模式雖然說只有乙個類,但是在應用中,作用也不小,下面看看單例模式和工廠模式的應用 1 懶漢式單例模式 public class usermanager 獲取唯一例項 public static usermanager getinstance 2 惡漢式單利模式 public class user...