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 种设计模式,更多的是一种编程习惯。它包含三个角色: