单例模式介绍

单例模式介绍

码农世界 2024-05-23 前端 87 次浏览 0个评论

【一】为什么要单例模式

单例设计模式:

  • 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

  • 当一个类的功能比较单一,只需要一个实例对象就可以完成需求时,就可以使用单例模式来节省内存资源。

    【二】如何实现一个单例

    • 要实现一个单例,我们需要知道要重点关注的点是哪些?

      • 考虑对象创建时的线程安全问题

      • 考虑是否支持延迟加载

      • 考虑获取实例的性能是否高(是否加锁)

    • 在python中,我们可以使用多种方法来实现单例模式

      • 使用模块

      • 使用装饰器

      • 使用类(方法)

      • 基于__new__方法实现

      • 基于元类metaclass实现

      # 创建一个普通的类
      class Student:
          ...
      ​
      ​
      # 实例化类得到对象 --- 类只要加 () 实例化就会产生一个全新的对象
      # 查看对象  --- 发现虽然是同一个类实例化得到的对象,但是对象的地址不一样
      # 每次使用都要重新打开,内存占用过高
      stu_one = Student()
      print(id(stu_one))  # 1764834580640
      stu_two = Student()
      print(id(stu_two))  # 1764834304080

      单例模式的实现

      # 方式一:
      class MyType(type):
          def __init__(cls,class_name,class_bases,class_name_space):
              # 给自己的类中加一个属性 instance 初始值是none
              cls.instance = None
              super().__init__(class_name,class_bases,class_name_space)
      ​
          def __call__(self, *args, **kwargs):
              obj = super().__call__(*args,**kwargs)
              # 判断 只要有就返回他不创建,没有就创建再返回
              if not self.instance:
                  self.instance =obj
              return self.instance
      ​
      ​
      class Student(metaclass=MyType):
          ...
      ​
      ​
      stu_one = Student()
      print(id(stu_one))      # 2645492891216
      stu_two = Student()
      print(id(stu_two))      # 2645492891216
      ​
      # 定制类的属性 ---》 元类 __init__
      # 定制对象的属性 ---> 元类 __call__
      ​
      ​
      # 方式二
      # 使用装饰器
      # outer 接受cls类作为参数
      def outer(cls):
          # 定义一个字典,键为cls,初始值为none,永远存储cls的单例实例
          instance = {'cls':None}
      ​
          def inner(*args, **kwargs):
              # 使用nonlocal关键字声明 instance变量,这意味着inner函数将修改在outer函数中定义的instance变量,而不是创建一个新的
              nonlocal instance
              # 进行判断是否有cls
              if not instance['cls']:
                  instance['cls'] = cls(*args, **kwargs)
              return instance['cls']
      ​
          return inner
      ​
      ​
      @outer
      class Student:
          ...
      ​
      ​
      stu_one = Student()
      print(id(stu_one))      # 1384468577632
      stu_two = Student()
      print(id(stu_two))      # 1384468577632

转载请注明来自码农世界,本文标题:《单例模式介绍》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,87人围观)参与讨论

还没有评论,来说两句吧...

Top