📜  Python设计模式-Singleton(1)

📅  最后修改于: 2023-12-03 15:04:41.934000             🧑  作者: Mango

Python设计模式 - Singleton

Singleton模式是一种创建模式,它保证一个类只有一个实例并且提供全局访问点。在Python中,使用Singleton模式可以限制在一个测试环境中只有一个数据库连接池或者只有一个web服务。

实现方法

在Python中实现Singleton模式的方法有多种,这里介绍其中几种较为流行的方法。

1. 使用装饰器

可以使用装饰器来实现Singleton模式。具体方法是在类定义前使用一个装饰器,这个装饰器返回一个新的类,这个新的类只有一个实例。

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class DatabaseConnectionPool:
    def __init__(self, host, port):
        self.host = host
        self.port = port
2. 使用元类

Python中使用元类可以创建类,这种方法的本质是在元类中重载__init__方法,在类创建时调用该方法,并且只创建一个实例。

class SingletonMeta(type):
    instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls.instances:
            cls.instances[cls] = super().__call__(*args, **kwargs)
        return cls.instances[cls]

class DatabaseConnectionPool(metaclass=SingletonMeta):
    def __init__(self, host, port):
        self.host = host
        self.port = port
3. 使用模块

在Python中,模块是天然的Singleton,只会在第一次导入时执行初始化操作,并且在后续导入中不会再次执行。

# database_connection_pool.py
class DatabaseConnectionPool:
    def __init__(self, host, port):
        self.host = host
        self.port = port

singleton_instance = DatabaseConnectionPool(host='localhost', port=8080)
# main.py
from database_connection_pool import singleton_instance

def main():
    connection = singleton_instance

if __name__ == '__main__':
    main()
优缺点

使用Singleton模式的优点是可以保证系统中只有一个实例,可以节约系统资源,提高系统效率。同时,也可以在某些特定场景下提供全局访问点。

使用Singleton模式的缺点是会增加系统的复杂度,代码实现不易理解。同时,如果不加限制地使用Singleton模式,会导致系统内部强耦合,增加系统维护难度。

适用情况

适用于需要保存全局状态的场合,例如数据缓存、日志记录等。同时,在多线程程序中,使用Singleton模式时需要注意对共享变量的加锁。