本文目录导读:

我来为您展示一个完整的Java建造者模式案例,以订餐系统为例:
经典建造者模式案例
产品类(美食订单)
public class Meal {
private String mainDish; // 主菜
private String sideDish; // 配菜
private String drink; // 饮料
private String dessert; // 甜点
private boolean hasToy; // 是否包含玩具
private String notes; // 备注
// 私有构造函数,只能通过建造者创建
private Meal() {}
public void setMainDish(String mainDish) {
this.mainDish = mainDish;
}
// ... 其他setter方法
@Override
public String toString() {
return "Meal{" +
"mainDish='" + mainDish + '\'' +
", sideDish='" + sideDish + '\'' +
", drink='" + drink + '\'' +
", dessert='" + dessert + '\'' +
", hasToy=" + hasToy +
", notes='" + notes + '\'' +
'}';
}
}
抽象建造者接口
public interface MealBuilder {
MealBuilder buildMainDish(String dish);
MealBuilder buildSideDish(String side);
MealBuilder buildDrink(String drink);
MealBuilder buildDessert(String dessert);
MealBuilder buildToy(boolean hasToy);
MealBuilder buildNotes(String notes);
Meal build();
}
具体建造者实现
public class StandardMealBuilder implements MealBuilder {
private Meal meal;
public StandardMealBuilder() {
this.meal = new Meal();
}
@Override
public MealBuilder buildMainDish(String dish) {
meal.setMainDish(dish);
return this;
}
@Override
public MealBuilder buildSideDish(String side) {
meal.setSideDish(side);
return this;
}
@Override
public MealBuilder buildDrink(String drink) {
meal.setDrink(drink);
return this;
}
@Override
public MealBuilder buildDessert(String dessert) {
meal.setDessert(dessert);
return this;
}
@Override
public MealBuilder buildToy(boolean hasToy) {
meal.setHasToy(hasToy);
return this;
}
@Override
public MealBuilder buildNotes(String notes) {
meal.setNotes(notes);
return this;
}
@Override
public Meal build() {
return meal;
}
}
导演类(可选,用于控制构建顺序)
public class MealDirector {
private MealBuilder builder;
public MealDirector(MealBuilder builder) {
this.builder = builder;
}
// 儿童套餐
public Meal constructKidsMeal() {
return builder
.buildMainDish("迷你汉堡")
.buildSideDish("薯条")
.buildDrink("橙汁")
.buildDessert("冰淇淋")
.buildToy(true)
.buildNotes("不要洋葱")
.build();
}
// 健康套餐
public Meal constructHealthyMeal() {
return builder
.buildMainDish("鸡胸肉沙拉")
.buildSideDish("蔬菜")
.buildDrink("绿茶")
.buildNotes("少盐")
.build();
}
}
客户端代码
public class BuilderPatternDemo {
public static void main(String[] args) {
System.out.println("=== 建造者模式示例 ===\n");
// 方式1:直接使用建造者
Meal meal = new StandardMealBuilder()
.buildMainDish("牛肉汉堡")
.buildSideDish("薯条")
.buildDrink("可乐")
.buildDessert("苹果派")
.buildToy(true)
.buildNotes("多放番茄酱")
.build();
System.out.println("自定义订单: " + meal);
// 方式2:使用导演类
MealBuilder builder = new StandardMealBuilder();
MealDirector director = new MealDirector(builder);
Meal kidsMeal = director.constructKidsMeal();
System.out.println("\n儿童套餐: " + kidsMeal);
Meal healthyMeal = director.constructHealthyMeal();
System.out.println("\n健康套餐: " + healthyMeal);
}
}
简化版(使用Lombok或静态工厂)
// Lombok @Builder 方式
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class Product {
private String name;
private String brand;
private double price;
private String category;
private String manufacturer;
private int stock;
}
链条式建造者(更灵活)
public class Computer {
// 必需属性
private final String cpu;
private final String ram;
// 可选属性
private String gpu;
private String storage;
private String display;
private String keyboard;
private String mouse;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.gpu = builder.gpu;
this.storage = builder.storage;
this.display = builder.display;
this.keyboard = builder.keyboard;
this.mouse = builder.mouse;
}
public static class Builder {
// 必需参数
private final String cpu;
private final String ram;
// 可选参数
private String gpu;
private String storage;
private String display;
private String keyboard;
private String mouse;
public Builder(String cpu, String ram) { // 必需参数在构造函数中
this.cpu = cpu;
this.ram = ram;
}
public Builder gpu(String val) { gpu = val; return this; }
public Builder storage(String val) { storage = val; return this; }
public Builder display(String val) { display = val; return this; }
public Builder keyboard(String val) { keyboard = val; return this; }
public Builder mouse(String val) { mouse = val; return this; }
public Computer build() {
return new Computer(this);
}
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", gpu='" + gpu + '\'' +
", storage='" + storage + '\'' +
", display='" + display + '\'' +
", keyboard='" + keyboard + '\'' +
", mouse='" + mouse + '\'' +
'}';
}
public static void main(String[] args) {
Computer computer = new Computer.Builder("i9-13900K", "32GB DDR5")
.gpu("RTX 4090")
.storage("2TB NVMe SSD")
.display("27\" 4K")
.keyboard("机械键盘")
.build();
System.out.println(computer);
}
}
建造者模式优点总结
✔ 优点:
- 将复杂对象的构建过程分离
- 灵活性强,可以按需构建
- 代码可读性好,参数语义清晰
- 支持链式调用
❌ 缺点:
- 对于简单对象可能过度设计
- 需要额外创建Builder类
使用场景
- 参数过多的对象:超过4-5个参数
- 参数有可选性:不是所有参数都需要
- 参数之间有依赖关系:构建顺序重要
- 不可变对象:需要防止修改
这种模式在java.lang.StringBuilder、java.util.stream.Stream等JDK类中都有应用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播