一、意图
保证一个类公有一个实例,并提供一个访问它的全局访问点。
二、使用场景
1、使用场景
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
2、实现的重要三个步骤
- 私有化构造方法(Swift不支持)
- 使用一个静态变量保存实例的引用
- 提供一个全局的访问方法
三、 Swift语言下的实现
Swift语言不支持变量及方法的权限,没有办法隐藏变量及方法,可以随意直接创建一个实例。单例的创建有很多写法,Swift支持只有struct支持静态变量,class不支持静态变量,所以很容易想到,在类的内部使用struct就能解决引用的保存问题,代码如下:
class GlobalData: NSObject {
struct Inner {
static var instance: GlobalData?
static var token: dispatch_once_t = 0
}
class var sharedInstance: GlobalData {
dispatch_once(&Inner.token, { () -> Void in
if Inner.instance == nil {
Inner.instance = GlobalData()
}
})
return Inner.instance!
}
}
class FirstSingleton: NSObject {
private static let _singleSharedInstance = FirstSingleton()
class func sharedInstance() -> FirstSingleton {
return _singleSharedInstance
}
private override init() {
}
}
class SecondSingleton: NSObject {
static let sharedInstance = SecondSingleton()
private override init() {
}
}