再也别用 Singleton 了好吗?
再也别用 Singleton 了好吗?
单例模式(Singleton Pattern)是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。但是,这种模式在现代编程中常常被滥用,甚至被认为是一种反模式。
单例模式的问题
- 全局状态:单例本质上是一种全局状态,这会使得代码难以测试和维护。
- 隐藏依赖:使用单例的代码会隐藏其依赖关系,使得代码的耦合性增加。
- 并发问题:在多线程环境中,单例的实现需要考虑线程安全问题。
替代方案
# 不好的做法 - 使用单例
class Database:
_instance = None
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance
def query(self, sql):
# 执行查询
pass
# 更好的做法 - 依赖注入
class Database:
def query(self, sql):
# 执行查询
pass
class UserRepository:
def __init__(self, database):
self.database = database
def find_user(self, user_id):
return self.database.query(f"SELECT * FROM users WHERE id = {user_id}")
依赖注入使得代码更容易测试,依赖关系更加明确,并且避免了全局状态带来的问题。