设计模式(五)单例模式(Singleton)

设计模式(五)单例模式(Singleton)_第1张图片
单例模式.png

意图:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。

适用性:
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

'''
Singleton
'''

class Singleton(object):
    ''''' A python style singleton '''

    # 实现__new__方法
    # 并在将一个类的实例绑定到类变量_instance上,
    # 如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
    # 如果cls._instance不为None,直接返回cls._instance
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            # super并不是一个函数,是一个类名,形如super(,)事实上调用了super类的初始化函数,产生了一个super对象;
            # super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例
            print cls.__name__
            print(type(cls))
            org = super(Singleton, cls)
            print type(org)
            cls._instance = org.__new__(cls, *args, **kw)
            print type(cls._instance)
        return cls._instance

if __name__ == '__main__':
    class SingleSpam(Singleton):
        def __init__(self, s):
            self.s = s

        def __str__(self):
            return self.s

    s1 = SingleSpam('spam')
    print id(s1), s1
    s2 = SingleSpam('spa')
    print id(s2), s2
    print id(s1), s1

运行结果

SingleSpam



2849827960200
spam
2849827960200
spa
2849827960200
spa

你可能感兴趣的:(设计模式(五)单例模式(Singleton))