单例模式
单例模式确保某一个类只有一个实例,并提供一个全局访问点。
单例模式的常见使用场景:
日志记录器:在整个应用程序中,需要维护一个日志记录器来记录重要事件,使用单例模式可以确保所有部分都使用同一个日志记录器实例。
数据库连接:在需要对数据库进行频繁操作的应用中,使用单例模式可以创建一个数据库连接实例,避免重复创建连接,提高性能。
配置信息管理:当应用程序需要访问配置信息(比如全局配置、用户配置等)时,可以使用单例模式确保只有一个全局访问点。
线程池:在多线程环境下,管理共享资源(如线程池)时,单例模式能够确保共享资源的唯一性和可控性。
计数器:在需要跟踪计数器状态或应用程序中有计数需求时,可以使用单例模式管理计数器。
缓存管理:在需要缓存数据以提高性能的场景中,使用单例模式可以管理全局缓存实例。
class Singleton(type):
"""单例元类."""
def __init__(cls, *args, **kwargs):
cls._instance = None
super(Singleton, cls).__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class MySingleton(metaclass=Singleton):
def __init__(self, value=None):
self.value = value
def main():
"""
>>> obj1 = MySingleton()
>>> obj2 = MySingleton()
>>> id(obj1) == id(obj2)
True
>>> obj1.value = 10
>>> obj2.value
10
>>> obj3 = MySingleton(20)
>>> obj3.value
10
"""
if __name__ == "__main__":
import doctest
doctest.testmod()
Last modified: 30 August 2024