工厂模式和策略模式区别

在技术圈的讨论里,不少程序员对工厂模式策略模式 产生了一些误解。有位老哥直接发帖:"这俩模式不就是一样的嘛?"听到这话,不少人都忍不住发出冷笑。就像有人把炒菜和火锅当成同一个做法------都是锅里煮出来的,能一样吗?所以,今天我们来聊聊这两个模式的区别,顺便用更接地气的例子,给大家解释一下。

背景故事:老王的奶茶店

故事的主角是老王,他经营着一家超火的**"王记奶茶店"。随着天气越来越热,顾客的需求量猛增,他逐渐忙不过来。于是老王想,能不能搞个系统,按照顾客的不同要求自动制作奶茶呢?他首先想到的就是工厂模式**。

工厂模式:奶茶制作的流水线

工厂模式 的思路就像自动化的流水线,老王不需要亲手制作每一杯奶茶,而是通过工厂方法,来生成不同口味的奶茶,比如珍珠奶茶椰果奶茶。这样一来,老王只需要点几下按钮,就能搞定所有的订单。

java 复制代码
// 奶茶类
abstract class MilkTea {
    public abstract void prepare();
}

// 珍珠奶茶类
class PearlMilkTea extends MilkTea {
    public void prepare() {
        System.out.println("Preparing Pearl Milk Tea...");
    }
}

// 椰果奶茶类
class CoconutMilkTea extends MilkTea {
    public void prepare() {
        System.out.println("Preparing Coconut Milk Tea...");
    }
}

// 奶茶工厂类
class MilkTeaFactory {
    public static MilkTea createMilkTea(String type) {
        switch (type) {
            case "Pearl":
                return new PearlMilkTea();
            case "Coconut":
                return new CoconutMilkTea();
            default:
                throw new IllegalArgumentException("Unknown milk tea type.");
        }
    }
}

// 老王的奶茶订单系统
class MilkTeaOrderSystem {
    public static void main(String[] args) {
        MilkTea milkTea = MilkTeaFactory.createMilkTea("Pearl");
        milkTea.prepare();
    }
}

通过工厂模式 ,老王把奶茶的制作流程封装在了工厂里,他只需选择想要的奶茶种类,工厂就会帮他完成制作。工厂模式让老王不再手忙脚乱,也不用担心误操作。

策略模式:让口味定制更灵活

不过,老王很快发现了新问题:不同顾客对于糖度和冰块量有不同的要求。光靠工厂模式是不够的,因为工厂只能决定奶茶的种类,但没办法灵活处理顾客的个性化需求。于是老王决定引入策略模式,让顾客根据自己的喜好选择糖度和冰块。

策略模式允许把这些选择封装为不同的策略,顾客可以自由选择,比如少糖全糖 ,或者多冰少冰

java 复制代码
// 糖度策略接口
interface SugarStrategy {
    void addSugar();
}

// 少糖策略
class LessSugarStrategy implements SugarStrategy {
    public void addSugar() {
        System.out.println("Adding less sugar...");
    }
}

// 全糖策略
class FullSugarStrategy implements SugarStrategy {
    public void addSugar() {
        System.out.println("Adding full sugar...");
    }
}

// 奶茶类
class CustomMilkTea {
    private SugarStrategy sugarStrategy;
    
    public CustomMilkTea(SugarStrategy sugarStrategy) {
        this.sugarStrategy = sugarStrategy;
    }
    
    public void prepare() {
        sugarStrategy.addSugar();
        System.out.println("Preparing milk tea with custom sugar level...");
    }
}

// 老王的策略模式奶茶订单系统
class MilkTeaOrderSystemWithStrategy {
    public static void main(String[] args) {
        // 顾客选择少糖奶茶
        SugarStrategy lessSugar = new LessSugarStrategy();
        CustomMilkTea milkTea = new CustomMilkTea(lessSugar);
        milkTea.prepare();
    }
}

策略模式让顾客可以根据个人口味来定制奶茶的糖度和冰块。老王只需提供相应的策略,就能满足顾客的个性化需求,不用再担心每次都要修改底层代码。

工厂模式 vs 策略模式:关键区别

在老王的故事里,工厂模式和策略模式虽然都出现在奶茶的制作流程中,但它们的作用完全不同。总结一下它们的区别:

  1. 关注点不同

    • 工厂模式 :主要关注对象的创建,即让系统根据不同的请求,生成相应的对象。
    • 策略模式 :主要关注行为的选择和替换,即让系统根据不同需求,灵活替换某些行为(如糖度、冰块)。
  2. 适用场景不同

    • 工厂模式适用于需要创建不同对象的场景,比如老王需要生成不同种类的奶茶。
    • 策略模式适用于行为变化频繁的场景,比如顾客定制不同的糖度、冰量。
  3. 灵活性不同

    • 工厂模式的对象一旦创建,后续行为固定。
    • 策略模式可以根据运行时的需求,随时调整和切换。

奶茶与代码的哲学

最终,老王的奶茶店借助工厂模式和策略模式,成功应对了顾客的各种需求,生意越来越好。只不过,老王有时候会感慨:"要是能有个系统,提前猜出顾客的口味就好了!" 这不就是传说中的数据驱动模式吗?


通过老王的奶茶店故事,我们不仅了解了工厂模式和策略模式的本质区别,还发现了如何在合适的场景下应用它们。下次你如果又遇到了"工厂模式"还是"策略模式"的问题,不妨想想老王做奶茶的故事。

相关推荐
意法半导体STM3216 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
山东点狮信息科技有限公司16 天前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
zzqssliu16 天前
基于策略模式与责任链的代购商品多源采集架构实战
架构·策略模式
mxpan17 天前
macOS 13+ 上使用 macFUSE + NTFS-3G 读写 NTFS 移动硬盘技术说明
macos·策略模式
折哥的程序人生 · 物流技术专研18 天前
Java 23 种设计模式:从踩坑到精通 | 番外:编排器+策略模式在多平台电子面单中的实战(含性能压测)
设计模式·策略模式·代码重构·java设计模式·编排器·电子面单·从踩坑到精通
忧云18 天前
2026年最新 Cursor 国内使用 DeepSeek API等各模型使用完整教程
ai编程·策略模式·cursor·byok·cursor使用国内大模型
AIex-YH18 天前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
回忆2012初秋19 天前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
怎么没有名字注册了啊19 天前
macOS 基于 CSDN GitCode + Homebrew Tap 发布 Qt .app 二进制程序通用教程(homebrew 安装自己的软件)
策略模式·homebrew·formula·ruhy
坏小虎20 天前
macOS 安装 Ghostty 终端完整教程:环境、依赖与美化配置
macos·策略模式