前言
背景
具有一定软件开发经验的读者应该都或多或少听到过由’四人组’(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides )总结的23种设计模式。这些设计模式对于特定的场景提供了一些通用的解决方案,这些方案经过了实践的检验,因此广泛应用于实际的开发生产过程中。
让我们从一个简单的例子开始:
运行结果:
One manager is instantiated.
One manager is instantiated.
My address is 2821183211392.
My address is 2821183211280.
False
从运行结果可以看出,我们Manager类的__init__方法两次被调用,也即实例化出了两个对象,同时两个对象也告诉我们它们具有不同的内存地址。
下面我们来看一下利用装饰器来实现单例模式:
运行结果:
One manager is instantiated.
My address is 1596847748376.
My address is 1596847748376.
True
从运行结果可以看出,虽然我们试图实例化两个Manager对象,但是__init__只被调用了一次,manager1与manager2拥有相同的内存地址,且它们告诉我们它们相同,其实,他们是同一个对象。
为什么会有这样的效果? 这就是singleton装饰器发挥的作用:
从装饰器的实现可以看出装饰器内部维护了一个字典,记录了类与对应实例的映射,当收到一个实例化请求时,装饰器会查看它拥有的字典,如果不存在请求类对应的实例,则创建一个新的实例并登记到字典中;如果这个类已经有一个实例登记在册,则直接返回登记的实例,如此保证了一个类只会有一个实例。同时,从用户的角度来看,如果用户想找到一个单例类的实例,也非常容易,和重新创建一个新实例一样。
从装饰器的使用来看,单例类与普通类的区别仅仅是在最开始的位置插入了一个单例装饰器声明,类内部实现并没有任何修改,这正是装饰器带来好处-无侵入地增强了被修饰对象的功能。
喜欢Python的小伙伴快快点击右上角的「关注」按钮,一起探索发现Python的乐趣!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!