工厂模式实现案例
场景一:配置文件解析(工厂模式实现)
1. 定义解析器接口与具体实现
from abc import ABC, abstractmethod
import json
import yaml
# 需要安装PyYAML库:pip install pyyamlclass ConfigParser(ABC):"""配置文件解析器接口"""@abstractmethoddef parse(self, content):"""解析配置内容"""passclass JsonParser(ConfigParser):def parse(self, content):return json.loads(content)class YamlParser(ConfigParser):def parse(self, content):return yaml.safe_load(content)class XmlParser(ConfigParser):def parse(self, content):# 简化示例,实际需使用xml库解析return {"xml_data": content}class UnsupportedFormatError(Exception):"""不支持的文件格式异常"""passclass ConfigParserFactory:"""配置文件解析器工厂"""_parsers = {'json': JsonParser,'yaml': YamlParser,'yml': YamlParser,'xml': XmlParser}@classmethoddef get_parser(cls, file_extension):"""根据文件扩展名获取解析器"""parser_class = cls._parsers.get(file_extension.lower())if not parser_class:raise UnsupportedFormatError(f"不支持的文件格式:{file_extension}")return parser_class()# 使用示例
json_config = '{"key": "value"}'
yaml_config = 'key: value'
xml_config = '<root><key>value</key></root>'# 解析JSON
json_parser = ConfigParserFactory.get_parser('json')
print(json_parser.parse(json_config)) # 输出:{'key': 'value'}# 解析YAML
yaml_parser = ConfigParserFactory.get_parser('yaml')
print(yaml_parser.parse(yaml_config)) # 输出:{'key': 'value'}# 解析XML
xml_parser = ConfigParserFactory.get_parser('xml')
print(xml_parser.parse(xml_config)) # 输出:{'xml_data': '<root><key>value</key></root>'}# 尝试解析不支持的类型
try:ConfigParserFactory.get_parser('csv')
except UnsupportedFormatError as e:print(e) # 输出:不支持的文件格式:csv
场景二:插件系统(工厂模式实现)
1. 定义插件接口与具体实现
from abc import ABC, abstractmethodclass Plugin(ABC):"""插件接口"""@abstractmethoddef execute(self, input_data):"""执行插件功能"""passclass TextUppercasePlugin(Plugin):def execute(self, input_data):return input_data.upper()class TextReversePlugin(Plugin):def execute(self, input_data):return input_data[::-1]class PluginFactory:"""插件工厂"""_plugins = {'uppercase': TextUppercasePlugin,'reverse': TextReversePlugin}@classmethoddef register_plugin(cls, plugin_name, plugin_class):"""注册新插件"""cls._plugins[plugin_name] = plugin_class@classmethoddef create_plugin(cls, plugin_name):"""创建插件实例"""plugin_class = cls._plugins.get(plugin_name)if not plugin_class:raise ValueError(f"未知插件:{plugin_name}")return plugin_class()# 使用示例
# 注册默认插件
PluginFactory.register_plugin('uppercase', TextUppercasePlugin)
PluginFactory.register_plugin('reverse', TextReversePlugin)# 创建并执行插件
uppercase_plugin = PluginFactory.create_plugin('uppercase')
print(uppercase_plugin.execute("hello")) # 输出:HELLOreverse_plugin = PluginFactory.create_plugin('reverse')
print(reverse_plugin.execute("hello")) # 输出:olleh# 动态注册新插件
class TextLengthPlugin(Plugin):def execute(self, input_data):return len(input_data)PluginFactory.register_plugin('length', TextLengthPlugin)# 使用新插件
length_plugin = PluginFactory.create_plugin('length')
print(length_plugin.execute("hello")) # 输出:5# 尝试创建未知插件
try:PluginFactory.create_plugin('unknown')
except ValueError as e:print(e) # 输出:未知插件:unknown
总结
-
配置文件解析
- 工厂模式应用:根据文件扩展名动态选择解析器(JSON/YAML/XML)。
- 扩展性:新增格式只需添加解析器类并注册到工厂。
- 错误处理:明确抛出
UnsupportedFormatError
异常。
-
插件系统
- 工厂模式应用:根据插件名称动态创建插件实例(如文本大写、反转、长度计算)。
- 动态注册:支持运行时注册新插件(如
TextLengthPlugin
)。 - 统一接口:所有插件实现
execute()
方法,保证一致性。
通过工厂模式,两个场景均实现了对象创建与业务逻辑的解耦,提升了代码的可维护性和扩展性。