欢迎访问www.allbetgaming.com!

首页科技正文

欧博开户:# Python设计模式 单例模式

admin2020-07-0528

目录
  • 什么是单例模式?
  • 为什么需要单例模式?
    • 单例模式和全局变量的区别?
  • 单例模式若何实现?
    • 基于装饰器的实现

什么是单例模式?

单例模式是一种写程序的方式,用单例模式设计的类,无论你去实例化多少次,获得的都是同一个实例,一样平常我们设计的类每次实例化都市天生差别的实例,然则单例模式就是反其道而行之,就像下面这样:

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

我们可以清晰的看到 ClassA的两个差别的实例在内存中的地址是相同的,也就是说两次实例化获得的工具是同一个工具,ClassB和ClassA也是一样的,由于都接纳了单例设计模式, 而ClassC由于没有接纳单例设计模式以是他的两个实例工具指向差别的内存地址,也就是说两次实例化获得的是两个差别的工具.

为什么需要单例模式?

要弄清楚为什么需要单例模式, 首先需要知道单例模式提供了哪些优异的特征?

单例模式提供的最为优异的特征就是:单例模式可以允许你在程序的任何地方接见某个特定的工具

通过单例设计模式, 你可以在不界说全局变量的情况下,在程序的任何地方接见你所指定的工具,单例模式所提供的功效和全局变量是一样的, 然则通过单例模式设计, 你就可以在无需牺牲代码可读性和平安性的前提下完成和全局变量完全一样的功效. 单例模式吸收了全局变量的优点摒弃了全局变量的瑕玷,是替换可恶全局变量不二的选择.

在上面的例子中我们可以看到无论实例化多少次ClassA获得的都是同一个工具, 若是这个类处于一个对照大的工程中,在这个工程中的任何位置实例化ClassA获得的都是同一个工具,这不就是全局变量吗, 然则和全局变量差别的是通过单例模式发生工具的代码加倍的易读,而且这种面向工具的编程方式可以确保ClassA所发生的工具只能被工具自身的方式所操作, 这样就加倍的平安, 而且你可以通过获取实例的方式对返回工具的行为举行更多的限制.

为什么需要单例模式? 本质上是由于人们需要全局变量,需要一个加倍好用加倍平安的全局变量, 单例模式的泛起解决了全局变量的现有问题, 以是人们才需要单例模式

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

单例模式像极了全局变量, 然则单例模式究竟不是实现全局变量, 除了上述所说的异同点之外, 通过单例模式发生的工具和全局变量另有一个显著的区别就是全局变量一旦界说就绝对不会再发生改变, 然则单例模式虽然说每次返回的都是一个牢固的工具, 但这个牢固的工具照样可以通过单例类自身的一些方式去更改的,以是单例模式发生的工具和全局变量比起来只能说是相对牢固的.

单例模式若何实现?

任何一门语言要想实现单例模式,可能都有许多的实现方式,然则实现思绪大同小异,一定都是在第一次天生实例的时刻就直接把实例给存储到某个地方,然后在下一次实例化的时刻直接返回这个事先被存储起来的实例,而不是重新去实例化返回一个新的实例.

基于装饰器的实现

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字典中找到事先存储好的工具返回,就是通过这样的方式实现单例的.

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

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

,

欧博官网

欢迎进入欧博官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.jswx10086.com/post/951.html

网友评论

最新评论

  • Allbet注册 09/23 说:

    欧博手机版下载欢迎进入欧博手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。高大上的感觉

  • Allbet注册 09/23 说:

    欧博手机版下载欢迎进入欧博手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。高大上的感觉

  • 联博统计接口 09/23 说:

    欧博allbet注册欢迎进入欧博allbet注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。每个人都应该看

  • Allbet手机版下载 09/22 说:

    欧博亚洲欢迎进入欧博亚洲(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。大家还记得我不

  • 环球UG充值 09/22 说:

    欧博电脑版下载欢迎进入博电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。只想说:都给我看!

  • 联博开奖网 09/22 说:

    环球UG欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。比打游戏有意思

  • UG环球手机版下载 09/21 说:

    联博开奖网www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。走一波走心评论

  • 欧博在线 09/21 说:

    欧博手机版欢迎进入欧博手机版(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。别忘了更啊