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

GoF设计模式——工厂方法模式

h5打开以查看

为什么需要简单工厂模式?

假设在开发一个通知系统,最初只支持邮件通知:

Notification n = new EmailNotification(); n.send("欢迎注册");

简单直接,没毛病。后来产品加了短信通知,代码变成了这样:

// 订单模块 if (type.equals("email")) { n = new EmailNotification(); } else if (type.equals("sms")) { n = new SmsNotification(); } n.send("订单已提交"); // 用户模块 if (type.equals("email")) { n = new EmailNotification(); } else if (type.equals("sms")) { n = new SmsNotification(); } n.send("注册成功"); // 营销模块 if (type.equals("email")) { n = new EmailNotification(); } else if (type.equals("sms")) { n = new SmsNotification(); } n.send("限时优惠来袭");

同一段 if-else 复制粘贴到十个地方。产品说"把默认通知方式改成短信",得满世界找,改漏一个就是线上 bug。这就是选择逻辑散落的痛——不是构造有多复杂,而是同样的判断写了十遍,改一处容易,改十处就要命。
很自然的想法:把选择逻辑收拢到一个地方,客户端只告诉工厂"我要什么":

public class NotificationFactory { public static Notification create(String type) { if ("email".equals(type)) { return new EmailNotification(); } else if ("sms".equals(type)) { return new SmsNotification(); } else { throw new IllegalArgumentException("未知的通知类型: " + type); } } }

现在改默认通知方式?改工厂一处就行。问题暂时解决了。✅

为什么需要工厂方法模式?

好景不长,产品要加微信、钉钉、站内信……每新增一种,就得打开工厂往里塞 else if

public static Notification create(String type) { if ("email".equals(type)) { return new EmailNotification(); } else if ("sms".equals(type)) { return new SmsNotification(); } else if ("wechat".equals(type)) { return new WechatNotification(); } else if ("dingtalk".equals(type)) { return new DingtalkNotification(); } else if ("inbox".equals(type)) { return new InboxNotification(); } else { throw new IllegalArgumentException("未知的通知类型: " + type); } }

工厂从5行膨胀到几十行,每次改动都有引入 bug 的风险。问题出在哪?简单工厂把"判断创建哪种"和"执行创建"绑死在一个类里,新增产品必须改老代码,违反开闭原则。
工厂方法模式的思路:不再用一个工厂搞定所有产品,而是定义抽象工厂接口,让每个具体工厂只负责一种产品:

public interface NotificationFactory { Notification create(); } public class EmailNotificationFactory implements NotificationFactory { public Notification create() { return new EmailNotification(); } } public class SmsNotificationFactory implements NotificationFactory { public Notification create() { return new SmsNotification(); } }

概念

工厂方法模式(Factory Method)是一种创建型设计模式,核心思想是将对象的创建延迟到子类。父类定义创建对象的接口(工厂方法),由子类决定实例化哪个具体类。

简单工厂 vs 工厂方法:简单工厂通过参数 + if-else 集中创建所有产品,适合产品种类少且稳定的场景;工厂方法通过抽象工厂 + 具体工厂将创建职责分散,每个工厂只管一种产品,符合开闭原则——新增产品不改已有代码。

简单工厂模式

简单工厂不属于 GoF 23 种设计模式,更多的是一种编程习惯。它包含三个角色:

<
http://www.jsqmd.com/news/1298913/

相关文章:

  • SVPWM算法原理与Simulink仿真实现:从电压矢量调制到电机控制
  • 深入解析U-Boot:嵌入式系统启动流程与BootLoader核心技术
  • 【AI 风向标】Reddit是什么?一文读懂全球最大兴趣社区平台
  • 近期Deepseek问题汇总2026年7月
  • 3分钟掌握手机号码定位查询:免费开源工具让你秒查归属地
  • 网络OSI七层模型是什么
  • LVGL标签控件深度解析:从基础显示到嵌入式GUI性能优化
  • C++十大排序算法全解析:从原理到实战应用指南
  • Godot多人游戏暂停菜单实现与性能优化实战
  • 2026甄选:专业装修公司与个性化设计品牌机构深度解析 - 优企名品
  • 仅限本周开放下载:《AI搜索产品对比决策手册》PDF(含可编辑选型评分表+供应商SLA条款审查清单+POC验收Checklist),错过再等半年更新
  • C/C++ Debug与Release混用:内存炸弹的成因与系统解决方案
  • 2026年 非标压铸模胚供应厂家:高精度定制与耐用品质优选 - 优企名品
  • Linux C语言Socket编程入门:从TCP通信到Echo服务器实战
  • 河南数据分析培训机构怎么选?2026年郑州靠谱机构盘点
  • C#与.NET框架核心架构解析:从CLR到现代语言特性
  • SAP-ABAP: ADOBE表单样式定制:JavaScript脚本、动态样式、二维码/条形码嵌入开发
  • STM32红外接收电路设计:电平转换与RC滤波实战指南
  • Python虚拟环境全解析:从venv到poetry,告别依赖地狱
  • ncRNA酵母双杂交技术:优化RNA-蛋白质互作检测方案
  • Mermaid Live Editor终极指南:5分钟学会免费在线图表编辑神器!
  • 自动化保研面试:从控制理论到工程实践的全方位准备指南
  • 终极Windows和Office激活指南:3分钟告别烦人的激活弹窗
  • 打破行业供需壁垒!深圳全咨数字科技,赋能工程咨询行业数字化升级
  • 2026年07月企业增长培训前5名参考:关注技术积累与业务落地的机构
  • DownKyi:解锁B站视频收藏新维度的智能下载体验
  • 贺州市防水补漏_2026桂东北三省交界山区漏水维修攻略与五大正规团队推荐 - 雨婺虹房屋维修
  • RV1126固件升级全攻略:从Loader/Maskrom模式到串口调试与OTA部署
  • 本科生科研入门:用小绿鲸系统学术训练全流程
  • 苹果反超英伟达重夺全球第一,BiyaPay 行情观察 AI 轻资产才是真出路?