• 周四. 5月 30th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

实现单例模式的四种方法

admin

11月 28, 2021

实现单例模式的四种方法

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

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

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>
'''

《实现单例模式的四种方法》有3个想法
  1. Wow, marvelous blog format! How lengthy have you been running a
    blog for? you make running a blog glance easy.
    The entire glance of your web site is excellent, let alone the content
    material! You can see similar here dobry sklep

  2. Wow, marvelous blog format! How lengthy have you been running
    a blog for? you make running a blog look easy.

    The overall look of your site is magnificent, let alone the content material!
    You can see similar here dobry sklep

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注