欢迎访问www.allbetgaming.com!

首页科技正文

大发888娱乐下载:单例模式

admin2020-07-1668

前言

单例模式应该是所有接触的设计模式初学者第一个听过的设计模式,这个模式应该是所有设计模式中最简朴的一个模式了。值得注意的是,许多开发者将单例模式视为一种反模式,因此单例模式在 Python 中的使用频率现在越来越少了。

反模式(英文:Anti-patterns或pitfalls), 是指用来解决问题的带有共同性的不良方式。它们已经经由研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产时辨认出来。软件开发中公认的反模式

意图

保证一个类仅有一个实例,并提供一个接见它的全剧接见点。

UML 图

简朴看一下单例模式的 UML 图

应用场景

单例模式最常使用的场景就是毗邻数据库以及日志等等,单例模式使用的场景通常有以下几个特点

  • 需要频仍实例化然后销毁的工具。
  • 建立工具时耗时过多或者耗资源过多,但又经常用到的工具。
  • 有状态的工具类工具。
  • 频仍接见数据库或文件的工具。 

代码

接下来让我们通过代码实现一个单例模式

简朴单例模式

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            instance = super().__call__(*args, **kwargs)
            cls._instances[cls] = instance
        return cls._instances[cls]


class Singleton(metaclass=SingletonMeta):
    def some_action(self):
        pass


if __name__ == "__main__":
    s1 = Singleton()
    s2 = Singleton()

    if id(s1) == id(s2):
        print("Singleton works")
    else:
        print("Singleton failed")

看一下输出:

Singleton works

线程平安单例模式

上面的单例模式可能会在多线程环境中失足,以是为了解决这个问题,我们将单例模式再升级一下

from threading import Lock, Thread


class SingletonMeta(type):

    _instances = {}
    _lock: Lock = Lock()


    def __call__(cls, *args, **kwargs):
        with cls._lock:
            if cls not in cls._instances:
                instance = super().__call__(*args, **kwargs)
                cls._instances[cls] = instance
        return cls._instances[cls]


class Singleton(metaclass=SingletonMeta):
    value: str = None

    def __init__(self, value: str) -> None:
        self.value = value

    def some_action(self):
        pass

def test_singleton(value: str) -> None:
    singleton = Singleton(value)
    print(singleton.value)


if __name__ == "__main__":
    # 由于是单例模式,预期两个线程输出的效果应该一样,都是第一个 FOO
    process1 = Thread(target=test_singleton, args=("FOO",))
    process2 = Thread(target=test_singleton, args=("BAR",))
    process1.start()
    process2.start()

看一下输出效果:

FOO
FOO

总结

单例模式优瑕玷

优点

  • 你可以保证一个类只有一个实例。
  • 你获得了一个指向该实例的全局接见节点。
  • 仅在首次请求单例工具时对其举行初始化。

瑕玷

  • 违反了单一职责原则
  • 单例模式可能掩饰不良设计, 可能会隐藏类之间的依赖关系。
  • 该模式在多线程环境下需要举行特殊处置, 制止多个线程多次建立单例工具。
  • 单例的客户端代码单元测试可能会对照难题, 由于许多测试框架以基于继续的方式建立模拟工具。 由于单例类的组织函数是私有的, 而且绝大部分语言无法重写静态方式。
  • 单例不支持有参数的组织函数,好比我们建立一个毗邻池的单例工具,我们没法通过参数来指定毗邻池的巨细。
,

欧博注册

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

本文链接:https://www.zhaoyuan777.com/post/979.html

网友评论

最新评论

  • 欧博亚洲网址 10/13 说:

    联博以太坊www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。挺好的,要自信

  • 欧博亚洲网址 10/13 说:

    联博以太坊www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。挺好的,要自信

  • UG环球开户 10/12 说:

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

  • Allbet官网 10/12 说:

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

  • UG环球代理 10/11 说:

    www.allbetgaming.com欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。感觉诚意满满的

  • ALLBET官网官方注册 10/11 说:

    Allbetwww.aLLbetgame.us欢迎进入Allbet平台(Allbet Gaming):www.aLLbetgame.us,欧博平台开放欧博(Allbet)开户、欧博(Allbet)代理开户、欧博(Allbet)电脑客户端、欧博(Allbet)APP下载等业务。每遍都有新的收获

  • 联博以太坊高度 10/11 说:

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

  • AllbetGmaing电脑版下载 10/10 说:

    联博API接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。我觉得挺好看的