首页 > 其他分享 >单例模式

单例模式

时间:2024-01-29 14:55:54浏览次数:14  
标签:__ tag 模式 实例 单例 设计模式 class

单例模式

一、什么是设计模式

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

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

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

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

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

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

三、如何实现单例模式

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

    • 问题:有问题才会有解决问题的方法
    • 解决方法:对上述问题拟定解决方案
    • 关键角色:我们所设计的模式,谁来用?怎么用?用在哪?
  • 在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

标签:__,tag,模式,实例,单例,设计模式,class
From: https://www.cnblogs.com/taoyuanshi/p/17994500

相关文章

  • 设计模式(二十三)访问者
    一、定义表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式二、描述访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通......
  • 通达信【金钻天启2210】幅图选股公式 全新思路的超短线操作实战模式指标,成熟实战的思
    原公式某地售价1500元哦,完全加密,股海网和谐源码文件分享本指标一个幅图信号公式,一个选股公式全新思路的超短线操作实战模式指标,本指标是一款以低吸判断最近洗盘结束后,捕捉强势龙头信号介入点提示,自动过滤近期市场弱势股与不活跃股;成熟实战的思路策略设计,快速提升选股能力;贴近......
  • 设计模式:策略模式/状态模式
    设计模式是通用的、可复用的代码设计方案,也可以说是针对某类问题的解决方案,因此,掌握好设计模式,可以帮助我们编写更健壮的代码。wiki中将设计模式分为四类,分别是:创建模式(creationalpatterns)结构模式(structuralpatterns)行为模式(behavioralpatterns)并发模式(concurrencypatt......
  • 用Java语言实现一个观察者模式
    观察者模式(也被称为发布/订阅模式),提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察的对象分开。在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者收到消......
  • 命令行模式
    定义:将“请求”封装成对象,以便使用不同的请求补充解释:解决了应用程序中对象的职责以及他们之间的通信方式,使发送者和接收者完全解耦,发送者和接收者之间没有没有直接关系,下命令的对象只知道如何发送请求,不知道如何完成请求类型:行为型适用场景:请求调用者和请求接收者需要解耦,......
  • 《设计模式之禅》读书笔记
    参考  https://zhuanlan.zhihu.com/p/357889775 一、六大设计原则单一职责原则定义:应该有且仅有一个原因引起类的变更。举例:属性和行为拆分,例如setPassword(Stringpassword)和changePassword(Stringpassword)。单一职责原则提出了一个编写程序的标准,用“职责”或“......
  • 设计模式
    1、设计模式七大原则:1)单一职责原则,一个类或者一个方法只负责一项原则2)接口隔离原则,客户端不应该依赖他不需要的接口3)依赖倒转原则,细节依赖抽象(面向接口编程)4)里氏替换原则,子类中尽量不重写父类的方法,可通过聚合、组合解决5)开闭原则,对扩展开放,对修改关闭6)迪米特法则,最少知道原......
  • jax框架为例:求hession矩阵时前后向模式的自动求导的性能差别
    注意:本文相关基础知识不介绍。给出代码:fromjaximportjacfwd,jacrevimportjax.numpyasjnpdefhessian_1(f):returnjacfwd(jacrev(f))defhessian_2(f):returnjacfwd(jacfwd(f))defhessian_3(f):returnjacrev(jacfwd(f))defhessian_4(f):ret......
  • 通达信【小楷超级竞价秘籍】竞价低吸+激进模式二合一玩转竞价 源码文件分享
     本套竞价指标,原价200金钻哦(1金钻=10元,就是2000元哦)小楷超级竞价秘籍,经过半年时间的研发测试,现在将这套系统推出!一、此指标包括选股预警+使用说明,预警时间为上午9.25-9.30分二、此指标包括两种竞价模式竞价激进模式+竞价低吸模式三、竞价激进模式适用于激进选手,出票一般都是......
  • 设计模式:创建型模式
    文章目录 1.简单工厂模式(SimpleFactory)1.1.定义1.2.结构1.3.时序图1.4.代码实现1.5.优缺点1.6.使用场景1.7.总结2.工厂方法模式(FactoryMethod)2.1.定义2.2.结构2.3.时序图2.4.代码实现2.5.优缺点2.6.使用场景2.7.总结3.抽象工厂模式(AbstractFactory)3.1.......