尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 种设计模式,更多的是一种编程习惯。它包含三个角色:
RELATED

相关推荐

sql 内连接 和in 比较

sql 内连接 和in 比较

NNER JOIN 和 IN 在 SQL 中都能用于关联查询,但它们的适用场景和性能表现有显著差异。下面是详细的对比分析。📊 核心区别对比维度INNER JOININ本质表连接操作,合并两张表集合成员判断操作语法FROM A JOIN B ON A.id B.idWHERE A.id IN (SEL…

📅 2026/9/18 22:12:16
51单片机驱动多色LED:从硬件原理到PWM调光实战

51单片机驱动多色LED:从硬件原理到PWM调光实战

1. 项目概述与核心价值上次我们聊了51单片机驱动单色LED的点亮、闪烁和流水灯,算是把最基础的IO口操作给摸透了。但现实中的项目,尤其是那些需要状态指示、氛围营造或者简单信息显示的场合,单色LED往往不够用。一个设备上,你可能需…

📅 2026/9/10 9:34:59
计算机组成原理实验:从逻辑门到ALU的数据通路设计与实现

计算机组成原理实验:从逻辑门到ALU的数据通路设计与实现

1. 实验目标与核心价值:从“黑盒”到“白盒”的认知跃迁 很多同学第一次接触《计算机组成与体系结构》这门课,尤其是看到“运算器”这三个字时,心里可能会犯嘀咕:这不就是CPU里算加减乘除的那个部件吗?我写C语言、Java…

📅 2026/8/5 0:19:45
MORE NEWS

更多资讯

📰

VS Code 远程代码同步:SFTP、Remote-SSH、rsync 三种方案

本地写代码、远程跑程序,这种"两栖"开发方式用过的人应该都有体会:改一行代码,开个终端 scp 一次,来回几次就烦了。尤其是调参数、试错、看日志这种高频迭代的活儿,手动传文件的成本高得离谱,一天…

📰

Python+LibreOffice批量处理doc教案:转换、抽取与校验实战

简介:这份资源是山东教育出版社一年级下册美术教学与学习案(全册),主要面向小学美术教师、教研人员和低年级家长,覆盖“百变影子”“小精灵”“材料多 点子巧”等课题,针对一年级学生的认知特点&#xff0c…

📰

Python实现文本相似度分析:算法对比与工程实践

简介:这份资源是一份PDF格式的原创技术笔记,面向希望快速掌握文本相似度分析实现路径的Python开发者与NLP入门者。内容以简洁的实例为主线,围绕“目标文档—测试文档—相似度计算”的完整流程,讲解jieba进行中文分词、gensim构建词…

📰

VS Code构建化学科研工作流:SMILES/LaTeX/Markdown三链协同

1. 为什么在 VS Code 里写化学分子式,不是“凑合用”,而是真刚需?我带过三届化学信息学方向的本科生毕设,也给制药企业做过分子数据管理系统的培训。每次开场第一句话都是:“别再用 Word 插公式、PPT 画结构、Excel 存…

📰

性能测试总结实战:从场景设计到瓶颈定位的完整路径

简介:面向软件测试人员的一份性能测试工作总结参考文档,内容围绕性能测试在软件生命周期中的价值、上线前压力测试与并发模拟的必要性,以及测试团队管理与项目协调经验展开。文档以心得体会形式梳理了如何撰写测试工作总结,覆盖需…

📰

PyWxDump 微信聊天记录导出与备份:现状说明与处置指南

PyWxDump 微信聊天记录导出与备份:现状说明与处置指南 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump PyWxDump 曾是一款开源的微信聊天记录解密与导出工具,可将本地微信数据批量导出为 CSV 和 HTML…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬