• 设计模式----创建型设计模式【单例模式】


    方式一:使用模块

    模块是天然的单例

    # 如果已经导入的模块被重新导入,Python不会重新解释一遍
    # 而是从内存中直接将原来导入的值拿来使用
    使用这种机制,可以维护一个模块间的公共对象,所有模块都可以往这个对象里传值,再取出

    ==========

    # 作为Python模块时是天然的单例模式
    
    #创建一个sington.py文件,内容如下:
        class Singleton(object):
            def foo(self):
                pass
        mysington = Singleton()
    
    # 运用
    from sington import mysington   # 不论import多少次,mysington对象都是单例的
    mysington.foo() 

    ==========

    '''
    把全局状态放在私有变量中
    并提供用于访问此变量的公开函数
    '''
    
    def get(refresh=False):
        if refresh:
            get.rates = {}
        if get.rates:
            return get.rates
        get.rates['usd'] = 0.4  # 初始化,可以从URL更新
        return get.rates
    
    get.rates = {}
    
    '''
    以上语句放入:Rates.py模块中
    创建了字典rates并将其作为Rates.get函数的属性。
    第一次执行:
    import Rates
    Rates.get()或者Rates.get(refresh=True)
    时,会下载全新的汇率数据,其他时候只需把最近下载的那份数据返回就行了。
    此处没有引入类,依然把汇率数据做成了单例的。
    '''

    方式二:重写__new__方法

    class Singleton:
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, "_instance"):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    
    class Foo(Singleton):  # 继承Singleton的类都是单例的,线程安全
        pass
    
    f1 = Foo()
    f2 = Foo()
    f3 = Foo()
    print(id(f1), id(f2), id(f3))
    
    # 34879944 34879944 34879944
  • 相关阅读:
    如果你的领导是力量型,你在汇报工作时应该注意()。
    项目管理的10项原则
    扑克k,你知道的人物吗?
    搭建属于您自己的软件版本控制
    Android保持屏幕常亮的方法
    BMP图像数据格式详解
    Android终止线程的方法
    使用ContentProvider访问其他应用的SharedPreferences数据
    android gps定位LocationManager
    Android属性之build.prop生成过程分析
  • 原文地址:https://www.cnblogs.com/staff/p/11642963.html
Copyright © 2020-2023  润新知