在技术圈的讨论里,不少程序员对工厂模式 和策略模式 产生了一些误解。有位老哥直接发帖:"这俩模式不就是一样的嘛?"听到这话,不少人都忍不住发出冷笑。就像有人把炒菜和火锅当成同一个做法------都是锅里煮出来的,能一样吗?所以,今天我们来聊聊这两个模式的区别,顺便用更接地气的例子,给大家解释一下。
背景故事:老王的奶茶店
故事的主角是老王,他经营着一家超火的**"王记奶茶店"。随着天气越来越热,顾客的需求量猛增,他逐渐忙不过来。于是老王想,能不能搞个系统,按照顾客的不同要求自动制作奶茶呢?他首先想到的就是工厂模式**。
工厂模式:奶茶制作的流水线
工厂模式 的思路就像自动化的流水线,老王不需要亲手制作每一杯奶茶,而是通过工厂方法,来生成不同口味的奶茶,比如珍珠奶茶 、椰果奶茶。这样一来,老王只需要点几下按钮,就能搞定所有的订单。
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 策略模式:关键区别
在老王的故事里,工厂模式和策略模式虽然都出现在奶茶的制作流程中,但它们的作用完全不同。总结一下它们的区别:
-
关注点不同:
- 工厂模式 :主要关注对象的创建,即让系统根据不同的请求,生成相应的对象。
- 策略模式 :主要关注行为的选择和替换,即让系统根据不同需求,灵活替换某些行为(如糖度、冰块)。
-
适用场景不同:
- 工厂模式适用于需要创建不同对象的场景,比如老王需要生成不同种类的奶茶。
- 策略模式适用于行为变化频繁的场景,比如顾客定制不同的糖度、冰量。
-
灵活性不同:
- 工厂模式的对象一旦创建,后续行为固定。
- 策略模式可以根据运行时的需求,随时调整和切换。
奶茶与代码的哲学
最终,老王的奶茶店借助工厂模式和策略模式,成功应对了顾客的各种需求,生意越来越好。只不过,老王有时候会感慨:"要是能有个系统,提前猜出顾客的口味就好了!" 这不就是传说中的数据驱动模式吗?
通过老王的奶茶店故事,我们不仅了解了工厂模式和策略模式的本质区别,还发现了如何在合适的场景下应用它们。下次你如果又遇到了"工厂模式"还是"策略模式"的问题,不妨想想老王做奶茶的故事。