1. 程式人生 > 其它 >Singleton 單例模式

Singleton 單例模式

  • 單例是一種設計模式,應用該模式的類只會生成一個例項。對外提供一個全域性訪問點(例如配置檔案)

  • 使用函式裝飾器實現單例

  • 使用類裝飾器實現單例

  • 使用 new 關鍵字實現單例

  • 使用 metaclass 實現單例

重寫 new 方法
class Singleton:
    _obj = None
    _init_flag = True

    def __new__(cls, *args, **kwargs):
        if cls._obj == None:
            cls._obj = object.__new__(cls)

        return cls._obj

    def __init__(self, name):
        if Singleton._init_flag:
            print('init......')
            self.name = name
            Singleton._init_flag = False


a = Singleton('a')
b = Singleton('b')

print(a)
print(b)
使用裝飾器實現
def singleton(cls):
    _obj = {}

    def inner(*args, **kwargs):
        if cls not in _obj:
            _obj[cls] = cls()
        return _obj[cls]

    return inner


@singleton
class Cls:
    def __init__(self,):
        print('init...')
        pass


a = Cls()
b = Cls()

print(a)
print(b)
類裝飾器實現
class Singleton:
    def __init__(self, cls):
        self.cls = cls
        self.obj = {}

    def __call__(self, *args, **kwargs):
        if self.cls not in self.obj:
            self.obj[self.cls] = self.cls()
        return self.obj[self.cls]


@Singleton
class Cls:
    def __init__(self):
        print('init...')


a = Cls()
b = Cls()
print(a)
print(b)