首页 > 其他分享 >工厂模式和策略模式区别

工厂模式和策略模式区别

时间:2024-09-09 08:56:40浏览次数:10  
标签:策略 区别 老王 模式 工厂 奶茶 public

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

背景故事:老王的奶茶店

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

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

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

// 奶茶类
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();
    }
}

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

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

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

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

// 糖度策略接口
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. 灵活性不同

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

奶茶与代码的哲学

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


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

标签:策略,区别,老王,模式,工厂,奶茶,public
From: https://blog.csdn.net/problc/article/details/142043140

相关文章

  • 在Java服务端实现策略模式:如何灵活应对业务逻辑的多变性
    在Java服务端实现策略模式:如何灵活应对业务逻辑的多变性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,业务逻辑的复杂性和多变性常常需要灵活的设计模式来应对。策略模式是一种经典的设计模式,用于定义一系列算法,将每一个算法封装......
  • java面试(9.8)接口和抽象类的区别
    接口:        定义了一组方法规范,但不提供这些方法的具体实现。接口的作用:定义规范:接口主要用于定义一个规范,规定了实现该接口的类必须遵守的规则。实现多继承:一个类可以实现多个接口,从而继承多个接口中定义的方法。解耦合:接口提供了一种解耦合的方式,使得代码......
  • 强化学习指南:训练过程与评估过程的区别
    强化学习指南:训练过程与评估过程的区别在强化学习(RL)中,训练和评估是两个截然不同但密切相关的过程。本指南将详细解释这两个过程的区别,以及如何正确实施它们。1.训练过程训练是RL中最核心的部分,它是智能体学习策略的过程。1.1训练的目的训练的目的是让智能体通过与环......
  • `match()`和`search()`在Python的`re`模块中的区别
    在Python的re模块中,match()和search()是两个非常重要的函数,它们都用于在字符串中搜索正则表达式的匹配项,但它们在搜索的起始位置和返回结果方面存在关键区别。一、match()函数match()函数尝试从字符串的起始位置匹配一个模式,如果不是从起始位置开始匹配的话,match()将不会成功......
  • 案例分析:如何用设计模式优化性能15
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能7
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。  事实上,大多数设计模式并不能增加程序......
  • 案例分析:如何用设计模式优化性能8
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能10
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • docker和container区别
    Docker和容器(Container)是相关但不同的概念。以下是它们之间的主要区别:1.定义Docker:Docker是一个开源平台,用于开发、交付和运行应用程序。它通过容器化技术提供了一种轻量级的方法来打包和部署应用及其依赖项。容器(Container):容器是一个轻量级、可移植的执行环境,封装......
  • docker网络模式有哪些?分别有什么优缺点?
    Docker提供了多种网络模式,以满足不同应用场景下的需求。主要的网络模式包括:1.Bridge网络模式描述:这是Docker的默认网络模式。每个容器都连接到一个虚拟的桥接网络(通常是docker0),并通过这个网络进行通信。优点:简单易用,适合大多数应用场景。支持容器间通过IP地址或......