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