美文网首页
python设计模式 - 单例模式之饿汉懒汉

python设计模式 - 单例模式之饿汉懒汉

作者: RedGecko | 来源:发表于2019-01-28 14:21 被阅读49次

python 环境

python==3.7.2

简介

单例模式要求类只能有一个实例化对象,该对象可以被全局访问。比如程序中配置文件被单例对象统一读取并在程序中全局使用,可避免产生多个配置类实例对象。类似的还有数据库的连接池管理,日志打印等场景。

使用场景

  1. 需要频繁实例化然后销毁的对象。
  2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  3. 有状态的工具类对象。
  4. 频繁访问数据库或文件的对象。

单例模式优点

  1. 单例模式只允许有一个单例对象存在
  2. 资源利用率高

单例模式缺点

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

饿汉式单例模式实现

预先加载,急切初始化,单例对象在类实例化前创建。

class Singleton(object):
    """  """
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    @classmethod
    def get_instance(cls):
        return cls._instance

    @classmethod
    def sum(cls, num1, num2):
        print(Singleton._instance)
        return num1 + num2

    @staticmethod
    def reduce(num1, num2):
        print(Singleton._instance)
        return num1 - num2

优点:
1. 线程安全
2. 在类实例化前已经创建好一个静态对象,调用时反应速度快
3. 直接执行其他方法或静态方法时,单例实例不会被初始化

缺点:
1. 不管使用与否,实例化前就初始化静态对象,有点资源浪费; ( 其实不算是大毛病)

懒汉式单例模式实现

懒汉式单例模式实现了资源的有效加载,只有在使用单例对象时才创建。

class Singleton(object):
    """
    # 懒汉模式: 只有在使用时才创建单例对象,实例化时不创建
    """
    _instance = None

    def __init__(self):
        if not hasattr(Singleton, '_instance'):
            print("__init__ method called, but no instance created")
        else:
            print("instance already created:", self._instance)

    @classmethod
    def get_instance(cls):
        if not cls._instance:
            cls._instance = Singleton()
        return cls._instance

优点:
1. 资源利用合理,不调用 get_instance 方法不创建单例对象

缺点:
1. 线程不安全,多线程时可能会获取到不同单例对象的情况。解决办法是加互斥锁,但会降低效率

模块级别的单例模式

在 python 中,所有模块都是单例。当导入模块时,如果该模块未导入,则导入该模块并实例化,如果该模块已导入,则直接返回实例化对象。

总结

建议使用 "饿汉式单例模型",若采用 "懒汉式单例模型",则特别注意加锁考虑线程安全问题。

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 2018-05-14

    单利设计模式 懒汉式 单例模式 饿汉式 单利模式 懒汉式与饿汉式的区别: 双重锁式 单例模式 (DCL )

  • 单例(Singleton)

    单例设计模式 单例模式的创建 饿汉式1 饿汉式2 懒汉式 优化后的懒汉式(线程安全): 饿汉式与懒汉式区别 单例模...

  • 大话设计模式之_单例模式

    大话设计模式之___单例模式 什么是单例模式单例模式有哪些(会顺带讲些懒汉式的性能优化)懒汉式与饿汉式的区别 什么...

  • java的单例模式

    饿汉单例模式 懒汉单例模式

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • Java单例模式

    1. 实现单例模式 饿汉模式和懒汉模式单例模式根据实例化时机分为饿汉模式和懒汉模式。饿汉模式,是指不等到单例真正使...

  • Singleton Pattern

    单例分为懒汉模式和饿汉模式: 饿汉模式 ...

  • 设计模式

    一、单例模式 饿汉模式 懒汉模式

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

网友评论

      本文标题:python设计模式 - 单例模式之饿汉懒汉

      本文链接:https://www.haomeiwen.com/subject/iclajqtx.html