单例模式(Singleton Pattern)
该模式的主要目的是确保某一个类只有一个实例存在,并提供一个全局访问点。
单例模式何时用
当你觉得一种对象只需要一个实例存在的时候,如:线程池(thread pool)、缓存(cache)、配置项、注册表、日志等。
单例模式好处
只会存在一个对象,所以便于维护、节约系统资源。
单例模式的实现方式
1. 用模块实现
新建文件singleton.py,然后输入以下代码:
# -*- coding: utf-8 -*-
class MySingleton(object):
def __init__(self):
self.name = 'MySingleton'
print('my_singleton init...')
def print_info(self):
print('I am %s' % self.name)
singleton_instance = MySingleton()
del MySingleton # 如果担心会被多次实例化,可以把类一起给删除掉
singleton_instance.print_info() # I am MySingleton
新建文件test.py,然后输入以下代码:
# -*- coding: utf-8 -*-
# 导入 singleton 模块中的 singleton_instance 符号
from singleton import singleton_instance
# 使用 singleton_instance 对象,由于 MySingleton 类在 test.py 中是不可见的,所以无法实例出新的对象
singleton_instance.print_info()
2. 用类实现
新建文件singleton.py,然后输入以下代码:
# -*- coding: utf-8 -*-
class Singleton(object):
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance
for i in range(10):
obj = Singleton()
print(obj) # <__main__.Singleton object at 0x0000000001D765F8>
# 所有对象地址相同,证明单例实例成功
结语
以上是Python中单例模式的相关知识。虽然通过装饰器等其它方法也可以实现单例,但武功强弱不在招式多少,重点在于能学以致用,解决问题。
如有好的建议希望大家留言讨论,共同进步。