單例模式在程序設計中是一種很重要的設計模式,它的核心思想是單例類在應用程序的整個生命周期中的實例都只存在一個(當然也可以不存在).
不管哪種編程語言,單例的底層實現方法都是差不多的,就是使用類的私有靜態指針變量指向類的唯一實例,并用一個僅有的靜態方法來獲取該實例.
舉個例子:
我們辦公室里有5個人,然后辦公室里有一臺打印機.辦公室里所有人的電腦都連接著這個打印機,但是不管誰要打印東西,都要通過這個唯一的打印機,所以我們辦公室里的這臺打印機就可以理解為"打印機類"的單例對象.這樣設計的好處就是可以節約資源,減少不必要的請求等.
在iOS開發中,經常會用到單例,比如我們常用的NSUserDefaults(Swift中為UserDefaults)類,就是一個單例類,原因很明顯,不管什么時候往里面寫東西,其實都是對同一個實例進行操作,不管什么時候往外讀取,也都是從這個實例進行操作,所以就有了
[NSUserDefaults standardUserDefaults];
(UserDefaults.standard)
一般情況下,使用"shared" ?"sharedInstance" ?"default" ?"standard"等字樣的,就是單例.
我們在自己開發的過程中,也可以參考這種單例模式,比如說一個Singleton單例類
在OC中設計單例:
在.h文件中開放單例類方法的接口:
+ (instanceType)sharedInstance;
在.m文件中實現如下:
首先聲名一個靜態對象:
static Singleton *sharedInstance = nil;
然后使用GCD中的dispatch_once_t實現接口中的單例類方法
+ (instanceType )sharedInstance {
? ? ? ? static dispatch_once_t once;
? ? ? ? dispatch_once(&once, ^{
? ? ? ? ? ? ? ? sharedInstance = [[self ?alloc] ?init];
? ? ? ? });
? ? ? ? return ?sharedInstance;
}
這樣在其他地方就可以使用
[Singleton? sharedInstance];
來獲取該單例對象了.
在Swift(3.0之后)設計單例:
swift中實現單例設計簡單到爆:
固定寫法:
static let sharedInstace = Singleton.init()
這樣通過
Singleton.sharedInstace
就可以獲取單例對象了.
但是這樣做,在使用中仍然可以通過
Singleton.init()
來初始化一個非單例對象,為了明確告訴使用者應當使用單例,可以單例類中再加一句代碼:
private override init() {}
將默認的init()方法重寫為私有方法,這樣在使用時直接調用init()方法就會報錯.