设计模式 - 23种设计模式之单例模式

单例模式(Singleton Pattern)

Ensure a class has only one instance, and provide a global point of access to it.html

确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例node

iOS应用举例

NSNotificationCenter
UIApplication
NSUserDefaultspython

Rules

  1. 单例必须在程序生命周期中是惟一的git

  2. 遵循第一条规则,也就是说确保单例的惟一性,大部分状况咱们考虑的是单例必须是thread-safe(12306抢票时,若是每一个人表明一个线程,要确保没有两我的买到一样的火车票,即在多线程并发的状况下可以保持逻辑正确,称做线程安全)github

代码实现

Objective-C

+ (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

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

Python(Singleton, metaclass, _metaclass_)

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

Node.js(node单线程, Modules, 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();