工厂模式(Factory Pattern)完整详解
工厂模式Factory Pattern完整详解工厂模式是软件开发中最常用的创建型设计模式核心思想是将「对象的创建」与「对象的使用」完全解耦。客户端无需关心对象如何实例化、依赖如何组装只需要通过「工厂」获取目标对象极大降低代码耦合同时满足开闭原则、单一职责原则等设计规范。工厂模式主要分为3 种形态复杂度从低到高依次为简单工厂模式静态工厂模式工厂方法模式抽象工厂模式其中工厂方法、抽象工厂属于GOF 23种经典设计模式简单工厂是其基础简化版工程中也极为常用。一、简单工厂模式Simple Factory1. 核心定义又称静态工厂模式由一个统一的工厂类根据传入的参数/类型动态创建不同的具体产品对象客户端不直接new对象。注意简单工厂不属于GOF 23种设计模式但它是理解工厂模式的基础。2. 核心角色角色作用抽象产品Product定义所有产品的公共接口/父类具体产品ConcreteProduct实现抽象产品是工厂创建的目标对象工厂类Factory核心类根据参数判断并创建具体产品客户端Client调用工厂获取产品不直接创建产品3. 代码示例Python以「生产不同形状」为例# 1. 抽象产品形状接口classShape:defdraw(self):pass# 2. 具体产品圆形、矩形classCircle(Shape):defdraw(self):print(绘制圆形)classRectangle(Shape):defdraw(self):print(绘制矩形)# 3. 简单工厂类classShapeFactory:staticmethoddefcreate_shape(shape_type):ifshape_typecircle:returnCircle()elifshape_typerectangle:returnRectangle()else:raiseValueError(不支持的形状类型)# 4. 客户端使用if__name____main__:# 客户端只调用工厂不new具体类shape1ShapeFactory.create_shape(circle)shape1.draw()shape2ShapeFactory.create_shape(rectangle)shape2.draw()4. 优点实现创建与使用分离客户端无需关注对象创建细节代码简洁使用成本极低统一管理对象创建便于维护5. 缺点违反开闭原则新增产品必须修改工厂类的判断逻辑工厂类职责过重所有产品创建逻辑耦合在一起产品种类过多时工厂类代码会极度臃肿6. 适用场景产品种类少且稳定几乎不需要扩展简单业务场景追求快速实现二、工厂方法模式Factory Method1. 核心定义对简单工厂的升级定义抽象工厂接口每个具体产品对应一个专属工厂子类对象实例化推迟到子类实现。遵循开闭原则新增产品时只需新增产品类对应工厂类无需修改原有代码。2. 核心角色角色作用抽象产品Product产品公共接口具体产品ConcreteProduct实现抽象产品抽象工厂Factory定义创建产品的接口方法具体工厂ConcreteFactory实现抽象工厂只创建一种具体产品客户端Client依赖抽象工厂调用方法获取产品3. 代码示例Python# 1. 抽象产品classShape:defdraw(self):pass# 2. 具体产品classCircle(Shape):defdraw(self):print(绘制圆形)classRectangle(Shape):defdraw(self):print(绘制矩形)# 3. 抽象工厂classShapeFactory:defcreate_shape(self):pass# 4. 具体工厂每个产品对应一个工厂classCircleFactory(ShapeFactory):defcreate_shape(self):returnCircle()classRectangleFactory(ShapeFactory):defcreate_shape(self):returnRectangle()# 5. 客户端使用if__name____main__:# 用圆形工厂创建圆形circle_factoryCircleFactory()circlecircle_factory.create_shape()circle.draw()# 用矩形工厂创建矩形rect_factoryRectangleFactory()rectrect_factory.create_shape()rect.draw()4. 优点严格遵循开闭原则新增产品只需新增类不修改旧代码单一职责原则每个工厂只负责创建一种产品逻辑清晰客户端依赖抽象不依赖具体类耦合度极低5. 缺点类数量爆炸式增长每加一个产品就要加一个工厂类实现复杂度高于简单工厂6. 适用场景产品种类多且需要频繁扩展希望代码严格遵循设计原则便于长期维护典型应用JDBC 数据库连接、日志框架不同实现切换三、抽象工厂模式Abstract Factory1. 核心定义工厂方法的进阶用于创建一系列相关/相互依赖的产品产品族而非单个产品。一个工厂可以生产多个关联产品保证产品之间的兼容性。产品族同一品牌下的多款产品如美的工厂生产空调冰箱格力工厂生产空调冰箱产品等级同一品类的不同品牌如美的空调、格力空调2. 核心角色角色作用抽象产品族定义多个产品的接口如空调、冰箱具体产品族实现抽象产品族属于同一品牌抽象工厂定义创建整个产品族的接口具体工厂实现抽象工厂生产一整套关联产品客户端依赖抽象工厂获取整套产品3. 代码示例Python以「家电工厂生产空调冰箱」为例# 1. 抽象产品族空调、冰箱classAirConditioner:defcool(self):passclassRefrigerator:deffreeze(self):pass# 2. 具体产品族美的系列、格力系列classMediaAirConditioner(AirConditioner):defcool(self):print(美的空调制冷)classMediaRefrigerator(Refrigerator):deffreeze(self):print(美的冰箱冷冻)classGreeAirConditioner(AirConditioner):defcool(self):print(格力空调制冷)classGreeRefrigerator(Refrigerator):deffreeze(self):print(格力冰箱冷冻)# 3. 抽象工厂生产整套家电classApplianceFactory:defcreate_air_conditioner(self):passdefcreate_refrigerator(self):pass# 4. 具体工厂classMediaFactory(ApplianceFactory):defcreate_air_conditioner(self):returnMediaAirConditioner()defcreate_refrigerator(self):returnMediaRefrigerator()classGreeFactory(ApplianceFactory):defcreate_air_conditioner(self):returnGreeAirConditioner()defcreate_refrigerator(self):returnGreeRefrigerator()# 5. 客户端使用if__name____main__:# 美的工厂生产整套美的家电media_factoryMediaFactory()media_acmedia_factory.create_air_conditioner()media_fridgemedia_factory.create_refrigerator()media_ac.cool()media_fridge.freeze()# 格力工厂生产整套格力家电gree_factoryGreeFactory()gree_acgree_factory.create_air_conditioner()gree_fridgegree_factory.create_refrigerator()gree_ac.cool()gree_fridge.freeze()4. 优点强制约束产品族兼容性避免不匹配的产品组合遵循开闭原则切换产品族只需更换工厂统一管理关联产品代码结构清晰5. 缺点扩展产品等级极难新增一个产品如洗衣机所有工厂都要修改复杂度最高设计成本高6. 适用场景系统中有多个产品族且产品族内产品相互关联需要保证产品配套使用避免混用典型应用UI组件库不同主题的按钮输入框弹窗、数据库不同方言适配四、三种工厂模式核心对比对比维度简单工厂工厂方法抽象工厂设计原则违反开闭原则遵循开闭原则遵循开闭原则工厂职责一个工厂造所有产品一个工厂造一种产品一个工厂造一族产品类数量最少较多最多复杂度低中高扩展难度难改工厂易加类产品族易扩展产品等级难扩展核心定位快速实现单产品灵活扩展多关联产品族管理五、工厂模式的核心价值解耦创建与使用客户端只负责用对象不负责造对象统一创建逻辑避免代码中大量new语句便于统一修改满足设计原则降低耦合提高代码可维护性、可扩展性隐藏实现细节复杂对象的依赖注入、初始化逻辑对客户端透明六、实际工程应用Spring 框架BeanFactory、ApplicationContext底层大量使用工厂模式创建BeanJDBCDriverManager获取Connection不同数据库驱动对应不同实现日志框架SLF4J 通过工厂适配 Logback、Log4j 等不同日志实现UI框架不同主题/平台的组件创建如移动端、PC端组件作为图像算法工程师CV/医疗AI/工业视觉工厂模式是工程化落地、多模型管理、实验迭代、跨平台部署里最常用、最实用的设计模式没有之一。结合日常做的目标检测YOLOv8、分割、医疗影像算法、模型部署ONNX/TensorRT、实验对比场景直接讲什么时候用 怎么写代码 工程收益。一、图像处理中什么时候必用工厂模式只要出现下面任意一种情况用工厂模式直接让代码清爽10倍同时维护多个模型YOLOv5/YOLOv8/RT-DETR/自定义检测模型、U-Net/DeepLab分割模型快速切换对比效果。同一任务有多种实现不同NMS普通NMS/DIoU NMS/Soft NMS、不同预处理医疗影像归一化/自然图像归一化、不同后处理。跨平台/跨推理引擎部署同一套业务逻辑切换 ONNX Runtime / TensorRT / OpenVINO / RKNN 推理。实验迭代频繁新加一个算法/模型不改业务代码只加新类。模块化SDK封装给前端/业务层调用隐藏模型加载、推理、预处理细节。医疗AI/工业视觉多任务舌诊检测、尿液分析、缺陷检测等多任务统一调度。二、结合CV实战三种工厂怎么用下面全是你日常写推理代码的真实场景Python实现可直接放进项目。场景1简单工厂 → 快速切换多个检测模型最常用适用你有YOLOv8、RT-DETR、自定义模型想一行代码切换不用到处改new Model()。核心思路一个工厂类根据模型名称返回对应的模型推理实例。importcv2importnumpyasnp# ------------------------------# 1. 抽象产品模型推理基类# ------------------------------classDetector:definfer(self,img:np.ndarray)-list:模型推理接口raiseNotImplementedError# ------------------------------# 2. 具体产品不同检测模型# ------------------------------classYOLOv8Detector(Detector):def__init__(self):# 加载YOLOv8 onnx/trt模型print(加载 YOLOv8 检测模型)definfer(self,img):print(YOLOv8 推理完成)return[{box:[10,20,100,200],score:0.95}]classRTDETRDetector(Detector):def__init__(self):print(加载 RT-DETR 检测模型)definfer(self,img):print(RT-DETR 推理完成)return[{box:[15,25,95,195],score:0.98}]# ------------------------------# 3. 简单工厂统一创建模型# ------------------------------classDetectorFactory:staticmethoddefcreate_detector(model_type:stryolov8)-Detector:ifmodel_typeyolov8:returnYOLOv8Detector()elifmodel_typertdetr:returnRTDETRDetector()else:raiseValueError(不支持的模型类型)# ------------------------------# 业务使用前端/主函数# ------------------------------if__name____main__:# 想换模型只改这里业务代码完全不动detectorDetectorFactory.create_detector(yolov8)imgcv2.imread(test.jpg)resultdetector.infer(img)print(result)你的收益换模型只改一个字符串不用改推理、后处理、绘图逻辑。模型加载细节全藏在工厂里业务层干净。场景2工厂方法 → 扩展新后处理算法符合开闭原则适用你要加新的NMS、新的后处理方式不修改原有代码直接新增类工厂。比如普通NMS、DIoU-NMS、医疗影像专用后处理。# ------------------------------# 1. 后处理接口# ------------------------------classPostProcess:defprocess(self,preds):raiseNotImplementedError# ------------------------------# 2. 具体后处理# ------------------------------classNMSPostProcess(PostProcess):defprocess(self,preds):print(执行普通NMS)returnpredsclassDIoUNMSPostProcess(PostProcess):defprocess(self,preds):print(执行DIoU-NMS)returnpreds# ------------------------------# 3. 工厂方法一个处理对应一个工厂# ------------------------------classPostProcessFactory:defcreate(self)-PostProcess:raiseNotImplementedErrorclassNMSFactory(PostProcessFactory):defcreate(self):returnNMSPostProcess()classDIoUFactory(PostProcessFactory):defcreate(self):returnDIoUNMSPostProcess()# ------------------------------# 使用# ------------------------------factoryDIoUFactory()postfactory.create()post.process([])你的收益以后加Soft NMS、后处理滤波只新增类不碰旧代码。多人协作不会改乱核心逻辑。场景3抽象工厂 → 整套CV流水线预处理模型后处理最贴合你医疗AI/尿液检测/舌诊项目一个工厂生产一整套流程预处理 → 模型推理 → 后处理不同任务检测/分割、不同硬件TensorRT/ONNX用不同工厂。# ------------------------------# 产品族预处理、推理、后处理# ------------------------------classPreProcess:defrun(self,img):passclassInfer:defrun(self,img):passclassPostProcess:defrun(self,pred):pass# ------------------------------# YOLOv8 TensorRT 整套流水线# ------------------------------classTRTYoloPreProcess(PreProcess):defrun(self,img):print(TRT-YOLO 预处理letterbox归一化)classTRTYoloInfer(Infer):defrun(self,img):print(TensorRT 推理)classTRTYoloPostProcess(PostProcess):defrun(self,pred):print(TRT-YOLO NMS后处理)# ------------------------------# 抽象工厂# ------------------------------classCVFactory:defcreate_pre(self)-PreProcess:passdefcreate_infer(self)-Infer:passdefcreate_post(self)-PostProcess:pass# ------------------------------# 具体工厂YOLOv8-TensorRT 工厂# ------------------------------classTRTYoloFactory(CVFactory):defcreate_pre(self):returnTRTYoloPreProcess()defcreate_infer(self):returnTRTYoloInfer()defcreate_post(self):returnTRTYoloPostProcess()# ------------------------------# 业务调用一套流程直接跑# ------------------------------factoryTRTYoloFactory()prefactory.create_pre()inferfactory.create_infer()postfactory.create_post()imgNonepre.run(img)featinfer.run(img)post.run(feat)你的收益切换部署平台TensorRT ↔ ONNX ↔ RKNN只换工厂。检测、分割、医疗影像任务流水线高度统一。项目工程化极强适合做成SDK给别人调用。三、作为图像算法工程师工厂模式的核心价值实验效率爆炸对比YOLOv8/RT-DETR/自定义模型不用删改代码直接传参切换。工程落地不混乱模型加载、推理、预处理解耦不会出现几千行的infer.py。跨硬件部署零成本TensorRT/ONNX/RKNN 一套代码适配业务层完全无感。多人协作不冲突算法同学加模型工程同学改流程互不干扰。医疗/工业视觉项目必备多任务、多模型、多设备必须用工厂做模块化管理。四、一句话总结CV视角简单工厂日常快速切换模型用得最多。工厂方法扩展新算法/后处理保证代码可维护。抽象工厂封装整套CV流水线做工程化SDK。