• 设计模式(一):单例模式


    什么是单例模式?

      单例模式是一种软件的设计模式,此模式下单例对象的类只能存在一个实例。当项目某些部分不会影响代码的执行时,例如日志记录器,使用单例模式设计是较好的一种方法。除此之外可以使用单例模式获得全局状态的有缓存、负载均衡、路由映射。

    单例模式分类

    一、懒单例

      需要调用相关方法才能创建单例,资源利用高,多线程访问时增大开销。

    singleton_lazy.py

    class Singleton_Lazy():
        __instance = None
    
        def __init__(self):
            pass
        @staticmethod
        def create_instance():
            if not Singleton_Lazy.__instance:
                Singleton_Lazy.__instance = Singleton_Lazy()
            return Singleton_Lazy.__instance
    

    test_lazy.py

    from danli.singleton_lazy import Singleton_Lazy
    dan1 = Singleton_Lazy().create_instance()
    dan2 = Singleton_Lazy().create_instance()
    print(dan1)
    print(dan2)
    
    dan3 =Singleton_Lazy()
    dan4 =Singleton_Lazy()
    print(dan3)
    print(dan4)
    

    调用create_instance()方法创建单例,因为单例的特性,所以单例1和2的内存地址相同。实例3和4未调用创建单例的静态方法,因此生成的是两个不同的实例。内存地址为D30和DA0。

    二、饿单例

      在初始化类时就自动创建单例,能保证线程安全,节省运行时间,会降低资源利用率。

    singleton_hunger.py

    class Singleton_Hunger():
        instance = None
        class __Singleton():
            pass
        def __new__(cls, *args, **kwargs):
            if not Singleton_Hunger.instance:
                cls.instance = Singleton_Hunger.__Singleton()
            return cls.instance
    

    test_hunger.py

    from singleton_hunger import Singleton_Hunger
    
    dan1 = Singleton_Hunger()
    dan2 = Singleton_Hunger()
    
    print(dan1)
    print(dan2)
    

    饿单例在类初始化时自动创建好单例

    单例模式优点

    1.只存在唯一的单例对象
    2.减少内存的占用,增加资源利用率

    单例模式缺点

    1.由于单例模式时全局共享的,所以单例对象的状态维护需要特别小心。
    2.单例对象一般职责过重,在一定程度上违背了“单一职责原则”。

    全局状态是我们在编程中需要警惕的一个地方,项目中的某些代码可能会影响该全局状态,从而造成不必要的麻烦。在实际的开发中,我们需要尽量避免单例模式的滥用。


    应用单例模式设计日志记录器—>单击此处

  • 相关阅读:
    使用nginx部署Yii 2.0yii-advanced-app-2.0.6
    yii-basic-app-2.0.5/basic/config/web.php
    PS显示图像大小快捷键
    说说c, c++ 和 go
    十分钟搭建自己的私有NuGet服务器-BaGet(转)
    Redis面试总结&史上最全Redis面试题及答案(转)
    Kubernetes之helm部署使用(转)
    Kubernetes RBAC 详解(转)
    Kubernetes 集群安全机制详解(转)
    Repository 返回 IQueryable?还是 IEnumerable?(转)
  • 原文地址:https://www.cnblogs.com/7levy/p/11244314.html
Copyright © 2020-2023  润新知