您当前的位置:首页 > 计算机 > 编程开发 > 设计模式

工厂模式和策略模式区别

时间:09-23来源:作者:点击数:
CDSY,CDSY.XYZ

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

在这里插入图片描述
背景故事:老王的奶茶店

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

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

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

// 奶茶类
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. 灵活性不同
    • 工厂模式的对象一旦创建,后续行为固定。
    • 策略模式可以根据运行时的需求,随时调整和切换。
奶茶与代码的哲学

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


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

CDSY,CDSY.XYZ
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
上一篇:设计模式:Builder模式 下一篇:很抱歉没有了
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐