zoukankan      html  css  js  c++  java
  • 实现单例模式的四种方法

    实现单例模式的四种方法

    单例模式定义:整个过程中只有一个实例,所有生成的实例都指向同一块内存空间

    第一种:(类的绑定方法)

    PORT = 3306
    HOST = '127.0.0.1'
    
    class Sql:
        instance = None
        def __init__(self,port,host):
            self.port = port
            self.host = host
        @classmethod
        def get_sigo(cls):
            if not cls.instance:
                cls.flag = cls(PORT,HOST)
            return cls.instance
        
    #每次调用get_sigoleton 拿到的对象都是同一个
    s1=Sql.get_si()
    s2=Sql.get_si()
    s3=Sql.get_si()
    s4=Sql('33306','192.168.1.1')
    print(s1)
    print(s2)
    print(s3)
    print(s4)
    '''
    <__main__.Sql object at 0x02DF4030>
    <__main__.Sql object at 0x02DF4030>
    <__main__.Sql object at 0x02DF4030>
    <__main__.Sql object at 0x02DF4190>
    '''
    

    第二种:(装饰器)

    #当用户输入端口和地址,实例化产生新对象
    #当用户不输入端口和地址,每次拿到的对象,都是同一个
    PORT = 3306
    HOST = '127.0.0.1'
    
    def get_sigo(func):
        instance = None
        def wrapper(*args,**kwargs):
            if len(args) != 0 or len(kwargs) != 0:
                #表示传了参数,生成新对象
                res = func(*args,**kwargs)
                return res
            else:
                nonlocal instance
                if not instance:
                    instance = func(PORT,HOST)
                return instance
        return wrapper
    
    @get_sigo
    class Sql:
        def __init__(self,port,host):
            self.port = port
            self.host = host
    
    s1=Sql()
    s2=Sql()
    s3=Sql('33306','192.168.1.1')
    s4=Sql('33306','192.168.1.1')
    print(s1)
    print(s2)
    print(s3)
    print(s4)
    '''
    <__main__.Sql object at 0x036A41B0>
    <__main__.Sql object at 0x036A41B0>
    <__main__.Sql object at 0x036A41D0>
    <__main__.Sql object at 0x036A41F0>
    '''
    

    第三种:(元类)

    PORT = 3306
    HOST = '127.0.0.1'
    
    class Mymeta(type):
        def __init__(self,name,bases,dic):
            # 把实例化好的对象,放到类的名称空间
            self.instance = self(PORT,HOST)
        def __call__(self,*args,**kwargs):
            if len(args) != 0 or len(kwargs) != 0:
                obj = object.__new__(self)
                obj.__init__(*args,**kwargs)
                return obj
            else:
                return self.instance
    class Sql(metaclass = Mymeta):
        def __init__(self,port,host):
            self.port=port
            self.host=host
            
    print(Sql.__dict__)
    s1=Sql()
    s2=Sql()
    s3=Sql('33306','192.168.1.1')
    print(s1)
    print(s2)
    print(s3)
    '''
    <__main__.Sql object at 0x034740D0>
    <__main__.Sql object at 0x034740D0>
    <__main__.Sql object at 0x03474050>
    '''
    

    第四种:(模块导入)

    # sigo 文件
    # ************************************
    PORT = 3306
    HOST = '127.0.0.1'
    class Sql():
        def __init__(self,port,host):
            self.port=port
            self.host=host
    
    s1=Sql(PORT,HOST)
    # ************************************
    
    def test():
        from sigo import s1
        print(s1)
    def test2():
        from sigo import s1 as s2
        print(s2)
    
    test()
    test2()
    from sigo import s1
    from sigo import Sql
    s2=Sql(3306,'192.168.1.1')
    print(s1)
    print(s2)
    
    '''
    <sigonleton.Sql object at 0x03A46AB0>
    <sigonleton.Sql object at 0x03A46AB0>
    <sigonleton.Sql object at 0x03A46AB0>
    <sigonleton.Sql object at 0x03A22E30>
    '''
    
  • 相关阅读:
    物联网常见通信协议RFID、NFC、Bluetooth、ZigBee等梳理
    最全NB-IoT/eMTC物联网解决方案名录汇总
    解析:智慧医疗发展的5大趋势
    国家集成电路产业基金“二期”正在酝酿,规模直逼万亿
    Java基础【基本数据类型包装类、int与String 之间的相互转换】
    Java基础 【Arrays 类的使用】
    Java基础【冒泡、选择排序、二分查找】
    String、StringBuffer 的使用 ,两个面试问题
    使用Java Api 操作HDFS
    Linux下使用wget下载FTP服务器文件
  • 原文地址:https://www.cnblogs.com/dadazunzhe/p/11461768.html
Copyright © 2011-2022 走看看