一、单例模式(Singleton Pattern)
1.1 核心定义
确保一个类仅有一个实例存在,并提供全局访问点。适用于需要严格控制实例数量的场景。
1.2 多种实现方式
方式1:模块级单例(推荐)
python
# singleton.py
class _Singleton:
def __init__(self):
self.config = {}
instance = _Singleton()
# 使用
from singleton import instance
instance.config["debug"] = True
方式2:装饰器实现
python
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 DatabaseConnection:
def __init__(self):
self.connection = create_connection()
方式3:元类实现(线程安全版)
python
import threading
class SingletonMeta(type):
_instances = {}
_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
with cls._lock:
if cls not in cls._instances:
instance = super().__call__(*args, **kwargs)
cls._instances[cls] = instance
return cls._instances[cls]
class Logger(metaclass=SingletonMeta):
def __init__(self):
self.logs = []
1.3 优缺点分析
优点:
- 资源高效利用(如数据库连接池)
- 全局状态统一管理
- 避免重复初始化开销
缺点:
- 违反单一职责原则
- 单元测试困难(全局状态污染)
- 多线程需额外处理同步问题
1.4 典型应用场景
- 配置管理(Django settings)
- 日志记录系统
- 硬件接口访问(如打印机控制)
- 缓存系统(Redis连接池)
二、工厂模式(Factory Pattern)
2.1 模式分类
类型 | 特点 | 适用场景 |
---|---|---|
简单工厂 | 一个工厂类创建所有产品 | 产品类型较少 |
工厂方法 | 每个产品对应专属工厂 | 需要扩展新产品 |
抽象工厂 | 创建产品族 | 系统需要多套组件 |
2.2 工厂方法模式实现
python
from abc import ABC, abstractmethod
class PaymentMethod(ABC):
@abstractmethod
def pay(self, amount):
pass
class Alipay(PaymentMethod):
def pay(self, amount):
print(f"支付宝支付{amount}元")
class WechatPay(PaymentMethod):
def pay(self, amount):
print(f"微信支付{amount}元")
class PaymentFactory(ABC):
@abstractmethod
def create_payment(self):
pass
class AlipayFactory(PaymentFactory):
def create_payment(self):
return Alipay()
class WechatFactory(PaymentFactory):
def create_payment(self):
return WechatPay()
# 使用
factory = AlipayFactory()
payment = factory.create_payment()
payment.pay(100) # 支付宝支付100元
2.3 抽象工厂模式实战
python
class GUIFactory(ABC):
@abstractmethod
def create_button(self):
pass
@abstractmethod
def create_menu(self):
pass
class WindowsFactory(GUIFactory):
def create_button(self):
return WindowsButton()
def create_menu(self):
return WindowsMenu()
class MacFactory(GUIFactory):
def create_button(self):
return MacButton()
def create_menu(self):
return MacMenu()
# 根据系统环境选择工厂
def get_factory(os_type):
factories = {
"windows": WindowsFactory,
"mac": MacFactory
}
return factories[os_type]()
2.4 模式优缺点
优点:
- 解耦对象创建与使用
- 符合开闭原则(扩展新类型不影响已有代码)
- 统一产品创建接口
缺点:
- 增加代码复杂度
- 需要预先设计工厂层级结构
- 学习曲线较陡峭
2.5 典型应用场景
- ORM框架(Django Model字段生成)
- 数据序列化(DRF根据格式生成不同输出)
- 跨平台UI组件库
- 文件格式解析器(Excel/CSV/JSON)
三、模式对比与选型指南
维度 | 单例模式 | 工厂模式 |
---|---|---|
主要目的 | 控制实例数量 | 封装对象创建 |
使用场景 | 全局状态管理 | 多态对象创建 |
扩展性 | 低 | 高 |
复杂度 | 低 | 中高 |
测试难度 | 高 | 低 |
最佳实践建议:
- 优先使用模块实现单例(Python天然特性)
- 简单场景用类装饰器,复杂场景用元类
- 工厂模式与依赖注入结合使用
- 避免单例的隐式依赖(考虑传递实例)
- 使用
abc
模块强化接口约束
四、真实框架应用案例
4.1 Django中的单例模式
python
# django/conf/__init__.py
class LazySettings(LazyObject):
def _setup(self, name=None):
# 全局配置单例
self._wrapped = Settings(settings_module)
settings = LazySettings()
4.2 DRF中的工厂模式
python
# rest_framework/parsers.py
class JSONParser(BaseParser):
media_type = 'application/json'
def parser_factory(media_type):
return {
'application/json': JSONParser,
'text/html': HTMLParser
}[media_type]()
# 根据请求头自动选择解析器
结语
单例模式与工厂模式作为经典设计模式,在Python生态中广泛应用。单例模式适合需要严格管控资源的场景,而工厂模式则为复杂对象创建提供优雅解决方案。实际开发中应根据业务需求灵活选择,避免过度设计,同时注意模式带来的副作用。建议结合Python语言特性(如模块系统、装饰器)实现更简洁的模式应用。```