
目录
注册模式(Registry Pattern)通过维护一个全局或单例的注册表(Registry),集中管理系统中可扩展的组件、类或实例的引用。组件在初始化时主动注册到表中,其他模块通过标识符(如名称、类型)从表中动态获取所需组件。
优势 | 说明 |
|---|---|
低耦合 | 组件通过注册表交互,无需直接引用具体类 |
高扩展性 | 新增组件只需注册,无需修改消费方代码 |
动态发现 | 运行时根据配置/输入动态加载组件 |
统一管理 | 所有可扩展组件在单一入口集中管理 |
# 插件自动注册示例
@register
class PDFExportPlugin:
def execute(self):
print("Exporting to PDF...")
# 系统根据用户选择加载插件
selected = config.get("export_format") # "PDFExportPlugin"
plugin = get_plugin(selected)
plugin.execute()
传统工厂模式:
class Factory:
@staticmethod
def create(product_type):
if product_type == "A":
return ProductA()
elif product_type == "B": # 新增产品需修改此处
return ProductB()
注册模式改造后:
@register
class ProductC: ... # 新增产品无需修改工厂
def create_product(name):
return REGISTRY[name]() # 自动支持所有注册类
# config.yaml
database:
adapter: "PostgreSQLAdapter"
# 根据配置动态加载适配器
adapter_class = get_plugin(config["database"]["adapter"])
db = adapter_class.connect()
from typing import Type, Dict
class Registry:
_store: Dict[str, Type] = {}
@classmethod
def register(cls, name: str = None):
def decorator(klass):
key = name or klass.__name__
cls._store[key] = klass
return klass
return decorator
@classmethod
def get(cls, name: str) -> Type:
if name not in cls._store:
raise KeyError(f"{name} not registered")
return cls._store[name]
@Registry.register("csv")
class CSVExporter:
def export(self, data):
print(f"Exporting {len(data)} rows to CSV")
@Registry.register("json")
class JSONExporter:
def export(self, data):
print(f"Generating JSON with {len(data)} items")
def create_exporter(format_name: str) -> Exporter:
exporter_cls = Registry.get(format_name)
return exporter_cls()
# 使用示例
exporter = create_exporter("csv")
exporter.export(data)
传统方式需要维护类型-类的显式映射:
MAPPING = {
"a": ClassA,
"b": ClassB # 新增类型需修改此处
}
注册模式通过自动注册实现零维护:
@register # 自动添加至注册表
class ClassC: ...
def list_plugins():
return Registry.list_all()
def disable_plugin(name):
Registry.mark_disabled(name)
@Registry.register("excel")
class ExcelExporter:
def export(self, data):
print(f"Creating Excel workbook with {len(data)} sheets")
# 客户端代码无需修改
if __name__ == "__main__":
formats = ["csv", "json", "excel"]
for fmt in formats:
exporter = create_exporter(fmt)
exporter.export(sample_data)
注册模式通过以下方式提升系统质量:
最佳实践建议:
# 进阶实现:线程安全注册表
from threading import Lock
class ThreadSafeRegistry:
_lock = Lock()
@classmethod
def register(cls, name):
def decorator(klass):
with cls._lock:
cls._store[name] = klass
return klass
return decorator
通过合理运用注册模式,可以构建出高扩展性、易维护的插件化系统,为复杂应用提供坚实的架构基础。