单例模式

作者: GHope | 来源:发表于2018-12-04 18:24 被阅读73次

    单例模式

    • 一个类只能创建出唯一的一个对象
      无状态对象或对象状态是共享的
      这样的对象通常可以设计为单例对象

    实现方式一:使用元类形成约束

    class SingletonMeta(type):
    
        def __init__(cls, *args, **kwargs):
            cls.__instance = None
            super().__init__(*args, **kwargs)
    
        def __call__(cls, *args, **kwargs):
            if cls.__instance is None:
                cls.__instance = super().__call__(*args, **kwargs)
            return cls.__instance
    
    
    class President(object,metaclass=SingletonMeta):
    
        def __init__(self, name, year = 4):
            self.name = name
            self.year = year
    

    实现方式二:魔术方法__new__

    class Singleton(object):
    
        def __init__(self, name):
            self.name = name
    
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            if cls.__instance is None:
                cls.__instance = super().__new__(cls)
            return cls.__instance
    

    实现方式三:装饰器

    from functools import wraps
    
    
    # 装饰类的装饰器 - 被装饰的不是函数而是一个类
    # singleton中的instances虽然是一个局部变量
    # 但是由于singleton函数返回的wrapper函数中使用了该变量
    # 所以它的生命周期会被延长(相当于是局部变量拥有了全局生命周期)
    # 这种现象就称之为闭包(closure)
    def singleton(cls):
        instances = {}
    
        @wraps(cls)
        def wrapper(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
    
        return wrapper
    
    
    @singleton
    class A(object):
    
        def __init__(self, name):
            self.name = name
    

    以上三种实现装饰器的方法中呢,推荐使用第三种。理由呢?便于理解啊,便于取消单例模式啊(.__wrapped__),便于使用啊。。。当然实现单例还有很多方法,有机会的话再研究研究吧!

    相关文章

      网友评论

        本文标题:单例模式

        本文链接:https://www.haomeiwen.com/subject/jgbzqqtx.html