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

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

Swift 實現(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
    }