zoukankan      html  css  js  c++  java
  • 设计模式----创建型设计模式【单例模式】

    方式一:使用模块

    模块是天然的单例

    # 如果已经导入的模块被重新导入,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
  • 相关阅读:
    给多个表的Dimension字段赋初值
    第十七章 性能(一)
    终于看到Inside Microsoft Dynamics Ax4.0了
    Snapin
    添加图片
    PHP功能齐全的发送邮件类,可以发送HTML和附件
    js重写的美化版select控件
    纯CSS的下拉菜单 支持IE6 IE7 Firefox
    BluePage通用分页类
    论坛结构改动,URL重写不影响收录地址的访问代码
  • 原文地址:https://www.cnblogs.com/staff/p/11642963.html
Copyright © 2011-2022 走看看