3分钟学会设计模式 — 单例模式

单例模式

3分钟学会设计模式 -- 单例模式

?使用场景

在编写软件时,对于某些类来说,只有一个实例很重要。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统中可以多次查询数据库,但是只需要一个连接,而不是每次查询都重新创建一个连接,因为重复创建数据库连接会浪费内存资源。因此这种情况下确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

如何保证一个类只有一个实例并方便访问呢?定义一个全局变量可以确保对象随时可以访问,但不能防止实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的使用场景。

?python实现

python中实现单例模式的方法很多,常用方法如下:

重写__new__

类实例化时是调用__new__方法创建对象的,所以只要控制__new__方法创建对象是只生成一个实例即可。

class DB:    instance = None    def __new__(cls, *args, **kwargs):        if cls.instance is None:            cls.instance = super().__new__(cls, *args, **kwargs)        return cls.instancedb1 = DB()db2 = DB()print(db1)print(db2)

运行代码结果如下:

<__main__.DB object at 0x000001BD06E55F70><__main__.DB object at 0x000001BD06E55F70>

?装饰器

将类的唯一实例保存在类属性上,然后通过类装饰器,在实例化时检查这个属性来控制只生成一个实例。

def single_obj(cls):    def wrapper(*args, **kwargs):        if cls.instance is None:            cls.instance = cls(*args, **kwargs)        return cls.instance    return wrapper@single_objclass DB:    instance = Nonedb1 = DB()db2 = DB()print(db1)print(db2)

运行代码结果如下:

<__main__.DB object at 0x000001E485395970><__main__.DB object at 0x000001E485395970>

?元类

python中元类是用于创建类对象的类,类对象创建实例对象时一定会调用__call__方法,因此重写元类的__call__方法,保证在调用__call__时只创建一个实例即可。

class SingleObj(type):    def __call__(cls, *args, **kwargs):        if getattr(cls, 'instance', None) is None:            cls.instance = super().__call__(*args, **kwargs)        return cls.instanceclass DB(metaclass=SingleObj):    passdb1 = DB()db2 = DB()print(db1)print(db2)

代码运行结果如下:

<__main__.DB object at 0x00000252D5AE4F70><__main__.DB object at 0x00000252D5AE4F70>

福利

软件测试简历模板,实战电子书,大厂面试题私信小编“资料”免费领取

3分钟学会设计模式 -- 单例模式

3分钟学会设计模式 -- 单例模式

3分钟学会设计模式 -- 单例模式

如果你觉得本文写的还不错,对你有帮助,请通过【点赞】让我知道,支持我写出更好的文章,这对我很重要

软件测试题库:包括了软件测试基础,MySQL数据库,Linux,Java自动化,Python自动化,性能测试,计算机基础,安全测试,接口测试,逻辑思维题,ISTQB,面试现场重现有单选题,多选题,判断题,简答题,提交答案即可获得答案,很快捷方便,随便注册一下就行

题库网站:


http://120.24.97.214:8380/Portal/user-login-page?rc=4

3分钟学会设计模式 -- 单例模式

3分钟学会设计模式 -- 单例模式

来源:软件测试芒果

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐