单例模式总结

2018-10-30  本文已影响0人  爱藏书友


class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

if __name__ == '__main__':
    s1 = Singleton()
    s2 = Singleton()
    print(id(s1))
    print(id(s2))

print('='*60)


class SingleLazy(object):
    _instance = None
    def __init__(self):
        if self._instance:
            print('object created.')

    @classmethod
    def getInstance(cls):
        if not cls._instance:
            cls._instance = SingleLazy()
        return cls._instance

if __name__ == '__main__':
    s1 = SingleLazy.getInstance()
    print(id(s1))
    s2 = SingleLazy.getInstance()
    print(id(s2))
    s3 = SingleLazy()
    print(id(s3))

print('='*60)


class SingleMeta(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(SingleMeta, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class LoggerDemo(metaclass=SingleMeta):
    pass

if __name__ == '__main__':
    l1 = LoggerDemo()
    l2 = LoggerDemo()
    print(id(l1))
    print(id(l2))

print('='*60)
# 装饰器
def singleton(cls, *args, **kwargs):
    _instances = {}
    def _singleton():
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]
    return _singleton


@singleton
class MysqlDB():
    pass

if __name__ == '__main__':
    db1 = MysqlDB()
    db2 = MysqlDB()
    print(id(db1))
    print(id(db2))
上一篇下一篇

猜你喜欢

热点阅读