🧱 建造者模式(Builder Pattern)
✅ 定义
建造者模式就是把「怎么一步步做一件复杂的东西」这件事,单独提出来管理。
将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。
🧠 换句话说:
- 如果一个对象的创建过程非常复杂(多步骤、步骤有顺序)
- 并且这个对象的不同版本只是在构建参数或步骤上有差异
- 那么就适合使用建造者模式
它让你可以:
- 同一个流程 → 做出不同风格的成品
- 不用记步骤,构造过程被封装好了!
🍔 举个通俗例子:做汉堡!
你是麦当劳点餐员,要做很多汉堡,但每种汉堡做法都类似:
1 2 3
| 👉 第一步:放面包 👉 第二步:放肉 👉 第三步:加酱料
|
不同汉堡:
- 牛肉汉堡 → 牛肉 + 番茄酱
- 鸡腿堡 → 鸡腿 + 辣酱
你不自己做,而是交给不同“汉堡工人”去做,这些工人就是“Builder”。
你只负责安排:做法顺序(这叫 Director)。
👨💻 Java 代码一步步来
🧩 第一步:定义产品类(汉堡)
1 2 3 4 5 6 7 8 9 10 11 12
| public class Burger { String bun; String meat; String sauce;
public void show() { System.out.println("🍔 汉堡配方:"); System.out.println("面包:" + bun); System.out.println("肉类:" + meat); System.out.println("酱料:" + sauce); } }
|
这是你最终要造出来的产品。
🧩 第二步:定义建造者接口(做汉堡步骤)
1 2 3 4 5 6
| public interface BurgerBuilder { void buildBun(); void buildMeat(); void buildSauce(); Burger getBurger(); }
|
🧱 第三步:具体建造者(牛肉汉堡、鸡腿堡)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public class BeefBurgerBuilder implements BurgerBuilder { private Burger burger = new Burger();
public void buildBun() { burger.bun = "芝麻面包"; }
public void buildMeat() { burger.meat = "安格斯牛肉"; }
public void buildSauce() { burger.sauce = "番茄酱"; }
public Burger getBurger() { return burger; } }
public class ChickenBurgerBuilder implements BurgerBuilder { private Burger burger = new Burger();
public void buildBun() { burger.bun = "全麦面包"; }
public void buildMeat() { burger.meat = "香脆鸡排"; }
public void buildSauce() { burger.sauce = "辣酱"; }
public Burger getBurger() { return burger; } }
|
每个 Builder 负责做一套不同的汉堡。
🧭 第四步:指挥者(安排步骤顺序)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class BurgerDirector { private BurgerBuilder builder;
public BurgerDirector(BurgerBuilder builder) { this.builder = builder; }
public Burger construct() { builder.buildBun(); builder.buildMeat(); builder.buildSauce(); return builder.getBurger(); } }
|
你是店长(Director),负责安排建造流程,但不管怎么建。
🧪 第五步:客户端使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Main { public static void main(String[] args) { BurgerBuilder beefBuilder = new BeefBurgerBuilder(); BurgerDirector director = new BurgerDirector(beefBuilder); Burger beefBurger = director.construct(); beefBurger.show();
BurgerBuilder chickenBuilder = new ChickenBurgerBuilder(); director = new BurgerDirector(chickenBuilder); Burger chickenBurger = director.construct(); chickenBurger.show(); } }
|
输出:
1 2 3 4 5 6 7 8 9
| 🍔 汉堡配方: 面包:芝麻面包 肉类:安格斯牛肉 酱料:番茄酱
🍔 汉堡配方: 面包:全麦面包 肉类:香脆鸡排 酱料:辣酱
|
📌 类图结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ┌─────────────┐ │ BurgerDirector │ <─── 指挥者:负责安排构建步骤 └──────┬──────┘ │ ┌────────▼────┐ │ BurgerBuilder 接口 │ <─── 抽象构建者:定义建造步骤 └───────▲─────┘ │ ┌──────────┴────┐ │ BeefBurgerBuilder │ <─── 具体建造者 │ ChickenBurgerBuilder │ └──────────┬────┘ │ ┌──────▼─────┐ │ Burger │ <─── 最终产品 └────────────┘
▲ │ ┌────┴────┐ │ Client │ <─── 使用者选择 Builder + Director 得到产品 └─────────┘
|
✅ 总结一句话
建造者模式是:指挥者定流程,建造者干活,产品类不管过程
最终你就能:换 Builder,得不同成品,但流程都一样!
🧠 用在哪些地方?
- 创建复杂对象(多个属性、参数)
- 多步骤流程构建对象
- 需要避免构造函数过长的情况