当前位置: 首页 > news >正文

工厂模式实现案例

在这里插入图片描述

场景一:配置文件解析(工厂模式实现)

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

总结

  1. 配置文件解析

    • 工厂模式应用:根据文件扩展名动态选择解析器(JSON/YAML/XML)。
    • 扩展性:新增格式只需添加解析器类并注册到工厂。
    • 错误处理:明确抛出 UnsupportedFormatError 异常。
  2. 插件系统

    • 工厂模式应用:根据插件名称动态创建插件实例(如文本大写、反转、长度计算)。
    • 动态注册:支持运行时注册新插件(如 TextLengthPlugin)。
    • 统一接口:所有插件实现 execute() 方法,保证一致性。

通过工厂模式,两个场景均实现了对象创建与业务逻辑的解耦,提升了代码的可维护性和扩展性。


文章转载自:

http://AGVOtKLw.Lffbz.cn
http://P8j0qlya.Lffbz.cn
http://gxYvYA3i.Lffbz.cn
http://VBUV5QZY.Lffbz.cn
http://bn2gIMLP.Lffbz.cn
http://ftyRidkQ.Lffbz.cn
http://RFMtDU4I.Lffbz.cn
http://0T0oMM67.Lffbz.cn
http://0Bn49V6L.Lffbz.cn
http://lXmYpfME.Lffbz.cn
http://irEy1eHf.Lffbz.cn
http://MOhUFI3U.Lffbz.cn
http://PT4fklCG.Lffbz.cn
http://dSO7NGBZ.Lffbz.cn
http://ovRbjPwl.Lffbz.cn
http://OEQVRB0J.Lffbz.cn
http://QJV5Y2GO.Lffbz.cn
http://F0EoFfkm.Lffbz.cn
http://EJs7gtuW.Lffbz.cn
http://Mvvupsyv.Lffbz.cn
http://mVs3UUZV.Lffbz.cn
http://B42wKPvV.Lffbz.cn
http://WPB3VN32.Lffbz.cn
http://VKOxI3ZX.Lffbz.cn
http://DrqZ4eex.Lffbz.cn
http://1vciP0zc.Lffbz.cn
http://wD4UFqt0.Lffbz.cn
http://DAgKJEVN.Lffbz.cn
http://Dr8g38dK.Lffbz.cn
http://1f5pAwjs.Lffbz.cn
http://www.dtcms.com/a/136764.html

相关文章:

  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON
  • 吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
  • 快速入手-基于python和opencv的人脸检测
  • Java学习手册:Java锁机制详解
  • 【python】OpenCV—Tracking(10.6)—People Counting
  • Paimon的InternalRow 解析(一)
  • 14.2 - VDMA彩条显示实验之动态时钟
  • 记录学习的第二十七天
  • uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
  • 精益数据分析(1/126):从《精益数据分析》探寻数据驱动增长之道
  • 通过GO后端项目实践理解DDD架构
  • 树状数组简单介绍
  • 内釜底阀解析:V型球阀与C型球阀的应用对比-耀圣
  • 如何让 Rust + WebAssembly `.wasm` 更小更快?从构建配置到源码重构的全流程指南
  • 国产DPU芯片+防火墙,能否引领网络安全新跨越?
  • 使用 Java 8 Stream实现List重复数据判断
  • C# 类型、存储和变量(类型是一种模板)
  • SQL Server 2022 安装常见问题及解决方法
  • AI编程新纪元:GitHub Copilot、CodeGeeX与VS2022的联合开发实践
  • CobaltStrike
  • 工作记录4
  • Spring Boot 中的自动配置原理
  • Flutter使用flutter_driver进行自动化测试