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

1. 工厂方法模式

一、是什么

工厂方法模式属于创建型设计模式的一种,提供了创建对象的接口。本质就是我们不关心生产对象的过程,我们只关心生成出什么样的对象。

二、作用是什么

  1. 降低了代码的耦合度
  2. 提高可扩展性,符合开闭原则
  3. 业务逻辑和构建逻辑解耦
  4. 面向接口编程

三、能够解决什么问题

  1. 大量 if/else 或 switch 的构造代码:新增产品必须修改原有的业务代码,会破坏开闭原则,导致代码不可维护(工厂方法就是通过多态来替换if-else、switch)
  2. 构造逻辑复杂且多变:比如参数的校验,构造依赖注入,资源装载。工厂方法模式就是把复杂构造逻辑从业务里抽出去,让每个对象有独立、可维护的创建入口。
  3. 隔离产品差异,确保扩展稳定。不同产品(对象)差异巨大,但业务层不应该感知差异,而应该只依赖抽象接口。

真实项目中构造逻辑很复杂,产品差异很大,如果不把构造封装在各自的工厂里,业务层会变成垃圾代码且高度耦合,系统无法迭代。
工厂方法的根本价值,是将高度差异化、复杂多变的构造过程从业务中剥离,确保业务只依赖抽象能力,使系统具备可维护、可扩展和可演进性。

四、适用的场景

场景为什么适合
支付体系(微信、支付宝、银行卡…)持续新增渠道、统一抽象支付行为
通知系统(短信、邮件、站内信…)渠道差异大但行为统一
文件解析(XML/JSON/YAML/CSV)针对格式扩展新的解析器
策略模块(风控策略、优惠策略)策略解耦、可动态切换
产品工单处理流程不同类型工单有不同处理器

五、特点

  • 抽象产品(Product)
    定义产品行为接口。

  • 具体产品(Concrete Product)
    实现产品的业务能力。

  • 抽象工厂(Creator)
    声明工厂方法(createProduct)。

  • 具体工厂(Concrete Creator)
    负责实际创建产品,封装构建细节。

六、编码实现

此处我以造车为例,车厂品牌有宝马和小米。

public interface CarFactory {Car createCar();
}
public class XiaomiCarFactory implements CarFactory {@Overridepublic Car createCar() {return new XiaomiCar();}
}
public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMWCar();}
}public interface Car {String getCar();
}public class XiaomiCar implements Car{@Overridepublic String getCar() {return "小米汽车";}
}public class BMWCar implements Car{@Overridepublic String getCar() {return "BMW";}
}public class demo {public static void main(String[] args) {CarFactory bmwCar = new BMWFactory();Car bmw = bmwCar.createCar();CarFactory xaiomiCar = new XiaomiCarFactory();Car xaiomi = xaiomiCar.createCar();System.out.println(bmw.getCar());System.out.println(xaiomi.getCar());}
}

七、分析框架源码

  1. Spring 的 BeanFactory = 抽象工厂角色

负责:

Bean 的定义加载

Bean 的统一管理

延迟实例化

  1. FactoryBean = 工厂方法模式的“衍生强化版”

FactoryBean 本质上是让 Bean 自己成为工厂,由框架托管。

典型处理逻辑:

用户调用 getBean(beanName) ↓ Spring 检测该 bean 是否实现 FactoryBean ↓ 是 → 使用
FactoryBean.getObject() 创建产品对象 否 → 使用默认实例化逻辑创建 bean

这正体现“抽象工厂定义规则,具体工厂决定实例化细节”。

框架使用工厂方法的根本原因 让对象的创建从“代码逻辑”变成“可配置、可拓展、可替换”的平台能力。

http://www.dtcms.com/a/560990.html

相关文章:

  • 【2025 SWPU-NSSCTF 秋季训练赛】jicao
  • 网站建设.龙兵科技做推广的网站那个好
  • trimesh库初步接触
  • 对链表进行插入排序:用Java实现
  • 资讯类网站建设方案书docker wordpress 4.2
  • 设计模式——原型模式(prototype)
  • 设计模式-单列模式
  • ArgoCD与Helm:云原生部署对比解析
  • 我的创作纪念日:从 2024.11.02 到今天的一整年
  • go语言 做网站外贸导向企业网站
  • 十堰微网站建设电话计算机哪个专业最吃香而且最简单
  • OpenCV(十六):椭圆的绘制
  • 数据仓库·简介(一)
  • 如何细分行业 做网站赚钱品质培训网站建设
  • 网站建设 思路室内设计平面图包括
  • 【软件安全】Web Security(Cookies / Session / XSS / SQL Injection / CSRF)概念介绍
  • 【踩坑篇】MyBatis-Plus拦截 ResultSetHandler.handleResultSets返回结果为空List
  • SSM框架高频考点
  • Chart.js 气泡图
  • C4D R21文字挤压的封盖变化详解
  • 网站咨询弹窗是怎么做的视频教做家常菜的网站
  • 网站备案 图标jsp网站开发框架
  • 网站翻页模板wordpress 点击导航链接老是跳转到当前页面
  • 计算机毕业设计java和Vue的在线购物系统 电商平台管理系统 网上购物平台
  • C++ string(四):编码
  • enumerate
  • C++ 多线程同步机制详解
  • EMB电子机械制动器夹紧力分析
  • 计算机操作系统:缓冲区管理
  • 绥化市建设工程网站招投标网站 服务器 域名