单例模式

单例模式

一、什么是设计模式

  • 解决问题的模板,在代码编写的过程中,前辈们会遇到很多问题并尝试解决,长久以来就形成了一套相对规范的解决方法
  • 而单例方法就是其中一种使用较多的设计模式

二、为什么要使用单例方法(设计模式)

  • 设计模式可以帮助开发人员编写高质量、可重用和易于维护的代码。

  • 通过使用设计模式,开发人员可以避免重复劳动,并确保他们的代码遵循最佳实践和行业标准。

  • 单例方法又有其独特之处:

    • 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
    • 当一个类的功能比较单一,只需要一个实例对象就可以完成需求时,就可以使用单例模式来节省内存资源

三、如何实现单例模式

  • 设计模式一般由三个部分组成

    • 问题:有问题才会有解决问题的方法
    • 解决方法:对上述问题拟定解决方案
    • 关键角色:我们所设计的模式,谁来用?怎么用?用在哪?
  • 在python中,我们可以使用多种方法来实现单例模式

    • 使用模块
    • 使用装饰器
    • 使用类(方法)
    • 基于__new__方法实现
    • 基于元类metaclass实现
  • 使用元类实现单例模式,控制类只能产生一个对象

class MyType(type):
    def __init__(cls, class_name, class_bases, class_dict):
        # 一旦调用我们定义的元类的子类,就会产生tag来标识这个类已经产生对象了
        super().__init__(class_name, class_bases, class_dict)
        cls.tag = None

    def __call__(cls, *args, **kwargs):
        # 在继承我们定义的元类后,只要类实例化过一次对象就会有tag标识
        if hasattr(cls, 'tag'):
            # 只要识别到这个标识就会直接返回原来已经产生过的对象而不会产生新的对象
            return cls.tag
        else:
            # 第一次示例化类的时候就会按照正常的实例化程序走
            obj = super().__call__(*args, **kwargs)
            return obj


class Person(metaclass=MyType):
    ...


people1 = Person()
people2 = Person()
# 第二次实例化类时,因为识别到了tag的存在,所以就直接把第一次实例出来的对象再次返回
# 这样不管第几次实例化出来的对象就都是第一次实例化出来的对象
# 这样就实现了控制类只能实例化出一个对象的功能,从而实现了单例模式
print(id(people1))  # 140720139278328
print(id(people2))  # 140720139278328
posted @ 2024-01-29 14:47  桃源氏  阅读(19)  评论(0)    收藏  举报