[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...