# Python设计模式 单例模式

什么是单例模式?

单例模式是一种写程序的方式,用单例模式设计的类,不管你去实例化多少次,获得的都是同一个实例,通常咱们设计的类每次实例化都会生成不一样的实例,可是单例模式就是反其道而行之,就像下面这样:编程

上图中的ClassA和ClassB 都是采用的 单例设计模式,而ClassC没有采用单例设计模式设计模式

咱们能够清晰的看到 ClassA的两个不一样的实例在内存中的地址是相同的,也就是说两次实例化获得的对象是同一个对象,ClassB和ClassA也是同样的,由于都采用了单例设计模式, 而ClassC由于没有采用单例设计模式因此他的两个实例对象指向不一样的内存地址,也就是说两次实例化获得的是两个不一样的对象.安全

为何须要单例模式?

要弄清楚为何须要单例模式, 首先须要知道单例模式提供了哪些优秀的特性?微信

单例模式提供的最为优秀的特性就是:单例模式能够容许你在程序的任何地方访问某个特定的对象闭包

经过单例设计模式, 你能够在不定义全局变量的状况下,在程序的任何地方访问你所指定的对象,单例模式所提供的功能和全局变量是同样的, 可是经过单例模式设计, 你就能够在无需牺牲代码可读性和安全性的前提下完成和全局变量彻底同样的功能. 单例模式吸取了全局变量的优势摒弃了全局变量的缺点,是替代可恶全局变量不二的选择.函数

在上面的例子中咱们能够看到不管实例化多少次ClassA获得的都是同一个对象, 若是这个类处于一个比较大的工程中,在这个工程中的任何位置实例化ClassA获得的都是同一个对象,这不就是全局变量吗, 可是和全局变量不一样的是经过单例模式产生对象的代码更加的易读,并且这种面向对象的编程方式能够确保ClassA所产生的对象只能被对象自身的方法所操做, 这样就更加的安全, 并且你能够经过获取实例的方法对返回对象的行为进行更多的限制.设计

为何须要单例模式? 本质上是由于人们须要全局变量,须要一个更加好用更加安全的全局变量, 单例模式的出现解决了全局变量的现有问题, 因此人们才须要单例模式3d

单例模式和全局变量的区别?

单例模式像极了全局变量, 可是单例模式毕竟不是实现全局变量, 除了上述所说的异同点以外, 经过单例模式产生的对象和全局变量还有一个明显的区别就是全局变量一旦定义就绝对不会再发生改变, 可是单例模式虽说每次返回的都是一个固定的对象, 但这个固定的对象仍是能够经过单例类自身的一些方法去更改的,因此单例模式产生的对象和全局变量比起来只能说是相对固定的.code

单例模式如何实现?

任何一门语言要想实现单例模式,可能都有不少的实现方法,可是实现思路大同小异,确定都是在第一次生成实例的时候就直接把实例给存储到某个地方,而后在下一次实例化的时候直接返回这个事先被存储起来的实例,而不是从新去实例化返回一个新的实例.对象

基于装饰器的实现

Python实现单例模式一个比较优雅的实现方式就是经过装饰器去实现,以下所示:

def singleton(cls):
    instances = {}
    def getinstance(*args,**kwargs):
        if cls not in instances:
            instances[cls] = cls(*args,**kwargs)
        return instances[cls]
    return getinstance

@singleton
class ClassA:
    pass

@singleton
class ClassB:
    pass

class ClassC:
    pass

aa=ClassA()
aaa=ClassA()

bb=ClassB()
bbb=ClassB()

cc=ClassC()
ccc=ClassC()

上面的例子咱们能够看到singleton是一个装饰器函数, 经过闭包的原理让其内部的 instances 变量的生命周期和全局变量等同,而后把被装饰的类第一次实例化生成的对象直接存储在instances中,在取对象的时候直接从在instances字典中找到事先存储好的对象返回,就是经过这样的方式实现单例的.

单例模式的实现方式还有不少种: 好比经过类属性实现, 经过元类实现等多种方式, 甚至每一种实现可能都有本身特定的应用场景, 可是我以为经过装饰器实现最为优雅, 本着少就是多的原则, 其余的实现方式我就再也不赘述, 若是对其余的实现方式感兴趣能够在早睡蟒公众号后台回复跬蟒加我微信(备注好公司岗位)交流沟通.

若是感受本篇内容还不错,微信的朋友请点个在看和赞,其余平台的朋友能够(近距离)扫描下方的二维码关注个人公众号 早睡蟒更多优质原创无广告内容等你来看.

相关文章
相关标签/搜索