zoukankan      html  css  js  c++  java
  • 实现单例的四种实现方法

    # <单例>
    # Singleton
    #
    # 单例:即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间
    # 如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了
    #
    #     实现原理,为了节省空间,结合需求让同一个类多次实例化后结果指向同一个对象
    #     可理解为开关,一次进入后更改 instance的状态
    
    +_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+
    
    << 1.类方法实现 >>
    
    class Singleton:
        __instance = None
        def change_instance(cls):
            if not cls.__instance:
                cls.__instance = cls()
            return cls.__instance
    
    +_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+
    
    << 2.装饰器实现 >>
    
    def outer(fn):
        _instance = None
        def inner(*args, **kwargs):
            nonlocal _instance
            if _instance == None:
                _instance = fn(*args, **kwargs)
            return _instance
        return inner
    
    @outer
    class Music:
        pass
    
    +_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+
    
    << 3.元类方法实现 >>
    
    class SingleMeta(type):
        __instance = None
        def __call__(cls, *args, **kwargs):
            if SingleMeta.__instance == None:
                SingleMeta.__instance = object.__new__(cls) # {}
                cls.__init__(SingleMeta.__instance, *args, **kwargs)
                print(SingleMeta.__instance.__dict__) # {} {'name': 'egon'}
            return SingleMeta.__instance
    
    class Songs(metaclass=SingleMeta):
        def __init__(self):
            self.name = 'egon'
        pass
    
    +_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+
    
    << 4.反射方法实现 >>
    
    class Singleton(object):
      def __new__(cls):
        if not hasattr(cls, 'instance'):
          cls.instance = super().__new__(cls)
        return cls.instance
    
    +_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

    << 5.__new__方法实现 >>
    class Singleton():
    __obj = None
    def __new__(cls):
    if cls.__obj is None:
    cls.__obj = object.__new__(cls)
    return cls.__obj
  • 相关阅读:
    OC中extern,static,const的用法
    pod install 报错
    设置Image渲染模式使用TintColor
    VLC 用到的那些 YUV 格式
    base64编码原理
    scp 拷贝文件时报错
    linux 恢复误删文件
    hadoop 集群安装(Cloudera CDH方式)
    记录自己需要读的几本书
    求解最长回文子串
  • 原文地址:https://www.cnblogs.com/max404/p/10808298.html
Copyright © 2011-2022 走看看