本文的單例模式分為嚴(yán)格單例模式不嚴(yán)格單例模式。單例模式要求一個(gè)類有一個(gè)實(shí)例,有公開(kāi)接口可以訪問(wèn)這個(gè)實(shí)例。嚴(yán)格單例模式,要求一個(gè)類只有一個(gè)實(shí)例;不嚴(yán)格單例模式,可以創(chuàng)建多個(gè)實(shí)例。

有的類只能有一個(gè)實(shí)例,例如 UIApplication,通過(guò) shared 屬性訪問(wèn)唯一的實(shí)例,屬于嚴(yán)格單例模式。有用戶登錄功能的 App 中,如果當(dāng)前用戶的數(shù)據(jù)模型與其他用戶的數(shù)據(jù)模型不同,那么當(dāng)前用戶的類也應(yīng)該用嚴(yán)格單例模式。在邏輯上,當(dāng)前用戶只有一個(gè),只能有一個(gè)實(shí)例;這樣可以在各個(gè)地方訪問(wèn)當(dāng)前用戶的數(shù)據(jù)。如果當(dāng)前用戶的數(shù)據(jù)模型與其他用戶的數(shù)據(jù)模型相同,則應(yīng)用不嚴(yán)格單例模式??梢越o其他用戶創(chuàng)建實(shí)例,同時(shí)也可以在各個(gè)地方訪問(wèn)當(dāng)前用戶的數(shù)據(jù)。

Swift 實(shí)現(xiàn)

嚴(yán)格單例模式

大多數(shù) Objective-C 的類都繼承自 NSObject,而 Swift 的類可以繼承自 NSObject 或者不繼承。

繼承自 NSObject

class SingletonClass: NSObject {    static let shared = SingletonClass()    
    // Make sure the class has only one instance
    // Should not init or copy outside
    private override init() {}    
    override func copy() -> Any {        return self // SingletonClass.shared
    }