Ensure a class has only one instance, and provide a global point of access to it.html
确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例node
NSNotificationCenter
UIApplication
NSUserDefaults
python
单例必须在程序生命周期中是惟一的git
遵循第一条规则,也就是说确保单例的惟一性,大部分状况咱们考虑的是单例必须是thread-safe(12306抢票时,若是每一个人表明一个线程,要确保没有两我的买到一样的火车票,即在多线程并发的状况下可以保持逻辑正确,称做线程安全)github
+ (instancetype)sharedInstance{ //我喜欢用GCD的方式 static SingleTonClass *sharedInstance = nil; //unique-ness static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //thread-safe sharedInstance = [[SingleTonClass alloc] init]; }); return sharedInstance; }
PS:Objective-C中没有私有方法,你仍是能够外部调用[[SingleTonClass alloc] init];
,只能靠协议来保证swift
class SingleTonClass { //真是简洁如swift啊, 缺点调试工具很差用,变化太快 static let sharedInstance = SingleTonClass() //thread-safe private init() {} //unique-ness }
PS: swift中全局变量static变量是由dispatch_once保证原子性的(A.K.A thread-safe)api
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class Logger(object): __metaclass__ = Singleton
var singleton = function singleton(){} singleton.instance = null; singleton.getInstance = function(){ if(this.instance === null){ this.instance = new singleton(); } return this.instance; } module.exports = singleton.getInstance();