# 单例模式

单例模式是最常见的模式之一,在django框架的admin后台应用则使用的这一模式。

# 单例模式特点

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点

# 代码实例

# 方式一

利用类对象生成实例, 每次创建对象需要调用 get_instance

class Singleton:
    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance


singleton = Singleton.get_instance()

# 方式二

可以把方式一,换成反射的写法,更加简洁一些,其实本质写法还是相同的。

class Singleton:
    @classmethod
    def get_instance(cls):
        if not hasattr(cls, '_instance'):
            setattr(cls, '_instance', cls())
        return getattr(cls, '_instance')

# 方式三:

利用内置 __new__() 函数的魔术方法,我们知道,python的new一个函数的时候实则通过此方式完成,并且这个new是可以定制的。这中写法的好处就是,不用显示的定义一个函数。

class Singleton:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            setattr(cls, '_instance', super().__new__(cls))
        return getattr(cls, '_instance')