• python---实现单例模式


    """
    单例模式
    
    单利模式是一种设计模式, 应用该模式的类只会生成一个实例, 可以保证在程序的不同位置
    都可以且仅可以取到同一个对象实例.
    
    如果实例不存在, 会创建一个实例, 但是如果已经存在就会返回这个实例.
    
    四种实现方法:
    1.函数装饰器实现单例模式
    2.类装饰器实现单例模式
    3.__new__实现单例模式
    4.metaclass实现单利模式
    """
    
    
    # 1.函数装饰器实现单例模式
    
    def singleton(cls):
        _instance = {}
    
        def get_instance():
            # 实例不存在创建实例
            if cls not in _instance:
                _instance[cls] = cls()
    
            # 实例存在直接返回
            return _instance[cls]
    
        return get_instance
    
    
    @singleton
    class Cls(object):
        def __init__(self):
            pass
    
    
    cls1 = Cls()
    cls2 = Cls()
    print(id(cls1) == id(cls2))  # True
    
    
    # 2.类装饰器实现单例模式
    
    class Singleton(object):
        def __init__(self, cls):
            self.cls = cls
            self._instance = {}
    
        def __call__(self):
            if self.cls not in self._instance:
                self._instance[self.cls] = self.cls()
    
            return self._instance[self.cls]
    
    
    @Singleton
    class Cls2(object):
        def __init__(self):
            pass
    
    
    cls3 = Cls2()
    cls4 = Cls2()
    print(id(cls3) == id(cls4))  # True
    
    
    # 3.__new__实现单例模式, 在创建实例的时候进行干预
    
    class Singleton2(object):
        _instance = None
    
        def __new__(cls, *args, **kwargs):
    
            # 实例不存在创建实例
            if cls._instance is None:
                cls._instance = super().__new__(cls, *args, **kwargs)
    
            # 实例存在直接返回
            return cls._instance
    
        def __init__(self):
            pass
    
    
    single1 = Singleton2()
    single2 = Singleton2()
    print(single1 == single2)  # True
    
    
    # 4.metaclass实现单利模式, 元类metaclass可以通过方法__metaclass__创造类
    
    class Singleton3(type):
        _instance = {}
    
        def __call__(cls, *args, **kwargs):
    
            if cls not in cls._instance:
                cls._instance[cls] = super().__call__(*args, **kwargs)
    
            return cls._instance[cls]
    
    
    class Cls3(metaclass=Singleton3):
        pass
    
    
    cls5 = Cls3()
    cls6 = Cls3()
    print(id(cls5) == id(cls6))  # True
    
    
    作者:凯旋.Lau
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Buffer -nodejs
    Tip提示框另类写法
    SASS入门
    界面设计必须要权衡的三个要素
    如何快速出稿一个优秀APP的构图
    如何画好一套线性图标
    Ui培训之如何设计极简三色图标
    移动APP设计国外资源总汇
    移动界面UI颜色设计
    APP专业视觉设计基础标准要求
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/12632822.html
Copyright © 2020-2023  润新知