时间:2021-05-22
单例模式的实现方式
将类实例绑定到类变量上
但是子类在继承后可以重写__new__以失去单例特性
class D(Singleton): def __new__(cls, *args): return super(D, cls).__new__(cls, *args)使用装饰器实现
def singleton(_cls): inst = {} def getinstance(*args, **kwargs): if _cls not in inst: inst[_cls] = _cls(*args, **kwargs) return inst[_cls] return getinstance@singletonclass MyClass(object): pass问题是这样装饰以后返回的不是类而是函数,当然你可以singleton里定义一个类来解决问题,但这样就显得很麻烦了
使用__metaclass__,这个方式最推荐
class Singleton(type): _inst = {} def __call__(cls, *args, **kwargs): if cls not in cls._inst: cls._inst[cls] = super(Singleton, cls).__call__(*args) return cls._inst[cls]class MyClass(object): __metaclass__ = Singleton
Tornado中的单例模式运用
来看看tornado.IOLoop中的单例模式:
为什么这里要double check?来看个这里面简单的单例模式,先来看看代码:
class Singleton(object): @staticmathod def instance(): if not hasattr(Singleton, '_instance'): Singleton._instance = Singleton() return Singleton._instance在 Python 里,可以在真正的构造函数__new__里做文章:
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance这种情况看似还不错,但是不能保证在多线程的环境下仍然好用,看图:
出现了多线程之后,这明显就是行不通的。
1.上锁使线程同步
上锁后的代码:
这里确实是解决了多线程的情况,但是我们只有实例化的时候需要上锁,其它时候Singleton._instance已经存在了,不需要锁了,但是这时候其它要获得Singleton实例的线程还是必须等待,锁的存在明显降低了效率,有性能损耗。
2.全局变量
在 Java/C++ 这些语言里还可以利用全局变量的方式解决上面那种加锁(同步)带来的问题:
在 Python 里就是这样了:
class Singleton(object): @staticmethod def instance(): return _g_singleton_g_singleton = Singleton()# def get_instance():# return _g_singleton但是如果这个类所占的资源较多的话,还没有用这个实例就已经存在了,是非常不划算的,Python 代码也略显丑陋……
所以出现了像tornado.IOLoop.instance()那样的double check的单例模式了。在多线程的情况下,既没有同步(加锁)带来的性能下降,也没有全局变量直接实例化带来的资源浪费。
3.装饰器
如果使用装饰器,那么将会是这样:
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言使用python实现设计模式中的单例模式。单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的。本文将简要介绍一下python中实现单例模式
单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。单例模式的介绍:在应用单例模式时,生成单例的类必须保证只有一个实
单例模式概念单例模式是指整个应用中类只有一个对象实例的设计模式。单例模式的特点一个类在整个应用中只有一个实例类必须自行创建这个实例必须自行向整个系统提供这个实例
单例模式是23中设计模式中最简单的设计模式,在企业开发中也应用的特别多。单例模式的优点是:项目中有且仅有一个实例。特点:构造器私有化,对象私有化,只提供一个对外
本文实例讲述了javascript设计模式–单例模式。分享给大家供大家参考,具体如下:介绍:单例模式是结构最简单的设计模式。单例模式用于创建那些在软件系统中独一