单例模式

Python中的单例模式


一、单例模式的概述
单例模式是一种常用的软件设计模式,通俗来说就是希望在系统中某个类的对象只能存在一个。主要有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

二、单例模式优缺点
优点:

  1. 实例控制:单例模式会阻止其他对象实例化其终极的单例对象的副本,从而确保所有的对象都访问唯一实例
  2. 灵活性:因为类控制了实例化过程,所以类可以实力更改实例化过程

缺点:

  1. 开销:虽然数量小,但是如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销
  2. 可能的开发混淆:使用单例对象(尤其是类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象
  3. 对象生成期:不能解决删除单个对象的问题,在提供内存管理的语言中,只有单例类能够导致单例类出现悬浮引用。

三、单例类的实现方式

  1. 实现__new__方法
class Singleton:
    __instance = None
    __is_init = True
    def __new__(cls, *args,  **kwargs):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, name):
        if Singleton.__is_init is False:
            Singleton.__is_init = True
            self.name = name


class MyClass(Singleton):
    a=1

解析:
实现__new__方法,然后将类的一个实例绑定到类变量__instance上,如果cls.__instance为None,则该实例没有被实例化过。

  1. 使用metaclass的用法
class Singleton:

    def __init__(self, name, bases, dict):
        super(Singleton, self).__init__(name, bases, dict)
        self._instance = None

    def __call__(self, *args, **kwargs):
        if self._instance is None:
            self._instance = super(Singleton, self).__call__(*args, **kwargs)
        return self._instance


class MyClass(object, metaclass=Singleton):
    a = 1

解析:
class Singleton中的__init__在Myclass声明的时候被执行Myclass=Singleton(),Myclass()执行时,最先执行父类的__call__方法,根据深度优先算法,会执行Singleton中的__call__方法。

  1. 装饰器
class Singleton:
    __instance = None
    __is_init = True
    def __new__(cls, *args,  **kwargs):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, name):
        if Singleton.__is_init is False:
            Singleton.__is_init = True
            self.name = name


@singleton
class MyClass(Singleton):
    a=1
posted @ 2022-03-21 14:31  KB、渣科  阅读(36)  评论(0编辑  收藏  举报