WHAT 單例模式
單例模式的類(lèi)圖可以說(shuō)是所有模式的類(lèi)圖中最簡(jiǎn)單的阳啥,它只有一個(gè)類(lèi)!
在開(kāi)發(fā)的過(guò)程中有些對(duì)象我們只需要一個(gè),比如iPhone實(shí)時(shí)提供設(shè)備坐標(biāo)的唯一硬件彭谁,CoreLocation 框架中的 CLLocationManager 類(lèi)。在單例模式中單例類(lèi)總是返回自己的同一個(gè)實(shí)例允扇,它提供了對(duì)類(lèi)的對(duì)象所提供的資源的全局訪(fǎng)問(wèn)點(diǎn)缠局。
在使用單例模式的時(shí)候,我們首先就要考慮到創(chuàng)建單例對(duì)象時(shí)候的線(xiàn)程安全問(wèn)題考润,在OC
的代碼中我們會(huì)使用 dispatch_once
來(lái)保證線(xiàn)程安全的生成一個(gè)實(shí)例對(duì)象狭园。
/// 個(gè)人實(shí)現(xiàn)一般會(huì)在.h 時(shí)候禁止調(diào)用new、init方法糊治,防止外部調(diào)用唱矛,生成多個(gè)對(duì)象
// Singleton.h
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
/// 一般OC的單例實(shí)現(xiàn)
+ (instancetype)shareInstance {
static dispatch_once_t onceToken;
static Singleton *instance;
dispatch_once(&onceToken, ^{
instance = [[Singleton alloc] init];
});
return instance;
}
/// 重寫(xiě)copy和mutecopy返回實(shí)例對(duì)象本身
Swift 創(chuàng)建單例對(duì)象
class Singleton {
static let sharedInstance = Singleton()
}
只需一行代碼,就完成了單例對(duì)象的創(chuàng)建井辜,Swift中使用 static
修飾 能保證變量在多線(xiàn)程的情況下也能懶加載只初始化一次绎谦。
當(dāng)我們需要在初始化之外執(zhí)行其他設(shè)置,則可以使用閉包的方式:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
let s = Singleton.sharedInstance