什么是单例模式
单例模式是用于确保类有一个实例的情况。常见的使用场景有数据库的连接对象
实现方式:
- 使用方法__new__()实现
- 单例装饰器
- 使用Metaclass
Example:
使用方法__new__()
class SingleDatabase:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = object.__new__(cls)
return cls._instance
single_database1 = SingleDatabase()
single_database2 = SingleDatabase()
print(id(single_database1))
print(id(single_database2))
单例装饰器方式
def singleton(class_):
instances = {}
def get_instance(*args, **kwargs):
# 需要单例化的类实例不在字典中则实例一个并存放在instances字典中
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return get_instance
@singleton
class DummyDatabase:
def __int__(self):
print('Load database')
dummy_database1 = DummyDatabase()
dummy_database2 = DummyDatabase()
print(id(dummy_database1))
print(id(dummy_database2))
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 DummyDatabase(metaclass=Singleton):
def __int__(self):
print('Load database')
dummy_database1 = DummyDatabase()
dummy_database2 = DummyDatabase()
print(id(dummy_database1))
print(id(dummy_database2))