python 单例模式的四种建立方式

单例模式

单例模式(Singleton Pattern)是一种经常使用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你但愿在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。git

好比,某个服务器程序的配置信息存放在一个文件中,客户端经过一个 AppConfig 的类来读取配置文件的信息。若是在程序运行期间,有不少地方都须要使用配置文件的内容,也就是说,不少地方都须要建立 AppConfig 对象的实例,这就致使系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤为是在配置文件内容不少的状况下。事实上,相似 AppConfig 这样的类,咱们但愿在程序运行期间只存在一个实例对象。github

在 Python 中,咱们能够用多种方法来实现单例模式:设计模式

  • 使用模块
  • 使用 __new__
  • 使用装饰器(decorator)
  • 使用元类(metaclass)

使用模块

其实,Python 的模块就是自然的单例模式,由于模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。所以,咱们只需把相关的函数和数据定义在一个模块中,就能够得到一个单例对象了。若是咱们真的想要一个单例类,能够考虑这样作:服务器

将上面的代码保存在文件 mysingleton.py 中,而后这样使用:函数

使用 __new__

为了使类只能出现一个实例,咱们可使用 __new__ 来控制实例的建立过程,代码以下:设计

在上面的代码中,咱们将类的实例和一个类变量 _instance 关联起来,若是 cls._instance 为 None 则建立实例,不然直接返回 cls._instance3d

执行状况以下:code

 

使用装饰器

咱们知道,装饰器(decorator)能够动态地修改一个类或函数的功能。这里,咱们也可使用装饰器来装饰某个类,使其只能生成一个实例,代码以下:对象

使用 metaclass

元类(metaclass)能够控制类的建立过程,它主要作三件事:

  • 拦截类的建立
  • 修改类的定义
  • 返回修改后的类

使用元类实现单例模式的代码以下:

小结

  • Python 的模块是自然的单例模式,这在大部分状况下应该是够用的,固然,咱们也可使用装饰器、元类等方法
相关文章
相关标签/搜索