zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    centos7查看yum安装的软件及路径
    CentOS7图形界面与命令行界面切换(转载)
    vmware安装centos7
    如何在IE11中设置兼容模式?设置的具体方法
    docker批量删除容器、镜像
    在Linux Centos 7.2 上安装指定版本Docker 17.03
    如何避免命令 rm -rf 的悲剧
    python django整理(五)配置favicon.ico,解决警告Not Found: /favicon.ico(转载)
    Ubuntu终端命令行缩短显示路径
    virtualenv 虚拟环境依赖安装
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/12632822.html
Copyright © 2011-2022 走看看