Python设计模式

Python设计模式

1 单例模式(Singleton)

https://zhuanlan.zhihu.com/p/37534850

1.1 单例模式是什么

单例是一种设计模式,应用该模式的类只会生成一个实例

单例模式保证了类在不同程序之间只会生成一个实例,即多个不同的程序每次调用这个类,都只会取到同一个对象实例。如果实例不存在,则创建一个实例,如果存在,则返回这个实例。

因为单例是一个类,可以为其提供编写相应的操作来实现管理这个实例。

单例模式的类只保证了一个实例存在,相当于整个系统只拥有一个全局对象,这样有利于我们协调系统整体的行为。

1.2 为什么要使用单例模式

防止资源混乱。相对于全局变量,在小规模场景下,还是很方便。不过如果代码规模量大,并且有很多文件的时候,使用全局变量就会使代码变得难以管理。你可能不知道在哪个文件中或其他代码中定义了相同类型甚至是相同名字的全部变量,这样会导致变量重名的问题。

所以可以使用单例模式去管理。

1.3 单例模式应用场景

  • 1 服务器配置信息:
    • 在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象去获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

1.4 单例模式的优缺点

https://www.cnblogs.com/restartyang/articles/7770856.html

1.5 四种方式实现单例模式

1.5.1 函数装饰器实现单例模式
def singleton(cls):
    _instance = {}
	def inner():
        if cls not in _instance:
            instance[cls] = cls()
        return _instance[cls]
    return inner

@singleton
class Cls():
    def __init__(self):
        pass
        
c1 = Cls()
c2 = Cls()
print(id(c1)==id(c2))
1.5.2 类装饰器实现单例模式
class Singleton():
    def __init__(self,cls):
        self._cls = cls
        self._instance = {}
    def __call__(self):
        if self._cls not in self._instance:
            self._instance[self._cls] = self._cls()
        return self._instance[self._cls]

@Singleton
class Cls():
    pass

cls1 = Cls()
cls2 = Cls()
print(cls1,cls2)
1.5.3 使用__new__方法实现单例模式
class Singleton(object):
    _instance = None
    def __new__(cls,*args,**kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls,*args,**kwargs)
        return cls._instance
    def __init__(self):
        pass

single1 = Singleton()
single2 = Singleton()
print(id(single1) == id(single2))
1.5.4 使用metaclass实现单例模式

先了解type创建类

def func():
    print('do something')

Klass = type('Klass',(),{'func':func})
k = Klass()
k.func()

使用metaclass方式

class Singleton(type):
	_instance = {}
    def __call__(cls,*args,*kwargs):
		if cls not in cls._instance:
            cls._instance[cls] = super(Singleton,cls).__call__(*args,**kwargs)
       	return cls._instance[cls]
    
class Cls(metaclass=Singleton):
    pass

cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值