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
  • 相关阅读:
    logstash 抓取IIS日志文件写入Elasticsearch
    logstash filter geoip 转换IP为详细地址等内容。
    windows2012 iis配置
    REST接口规范
    windows10后台启动redis
    Docsify生成文档网站
    IDEA类和方法注释自动生成(2019-08-31 21:47写)
    键盘注释
    使用git上传项目解决码云文件次数上传限制(2019-09-25 12:49编写)
    Electron之Hello world(一)
  • 原文地址:https://www.cnblogs.com/staff/p/11642963.html
Copyright © 2011-2022 走看看