当前位置: 首页 > news >正文

04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学

目录

    • 序章:当你的对象比巨无霸汉堡更复杂时
    • 一、基础建造师入门课
      • 1.1 传统Builder模式实现
    • 二、现代建造师进化指南
      • 2.1 流式接口(Fluent API)
      • 2.2 Lombok建造者(极简主义)
    • 三、高级建造工厂
      • 3.1 泛型建造者
      • 3.2 线程安全建造者
    • 四、特殊建造技巧
      • 4.1 组合建造者
      • 4.2 分阶段建造
    • 五、Spring中的建造者模式
      • 5.1 结合工厂模式
      • 5.2 配置类建造者
    • 建造者模式选择指南
    • 终章:建造者的宇宙法则

序章:当你的对象比巨无霸汉堡更复杂时

🍔 订餐困境
你想点一份包含三层牛肉、双份芝士、不要酸黄瓜、加辣蛋黄酱、搭配番薯条的定制汉堡——普通构造器需要8个参数且充满null值!建造者模式就是你的"订单配置系统",让你用优雅的方式组装复杂对象。


一、基础建造师入门课

1.1 传统Builder模式实现

// 宇宙飞船的零件清单
public class SpaceShip {private final String engine;      // 必选private final int fuel;           // 必选private String weaponSystem;      // 可选private boolean escapePod;         // 可选private String aiCore;            // 可选private SpaceShip(Builder builder) {this.engine = builder.engine;this.fuel = builder.fuel;this.weaponSystem = builder.weaponSystem;this.escapePod = builder.escapePod;this.aiCore = builder.aiCore;}// 建造者控制台public static class Builder {private final String engine;private final int fuel;private String weaponSystem = "None";private boolean escapePod;private String aiCore = "Basic";public Builder(String engine, int fuel) {this.engine = engine;this.fuel = fuel;}public Builder weaponSystem(String system) {this.weaponSystem = system;return this;}public Builder escapePod(boolean hasPod) {this.escapePod = hasPod;return this;}public Builder aiCore(String core) {this.aiCore = core;return this;}public SpaceShip build() {validate();return new SpaceShip(this);}private void validate() {if (fuel < 1000) {throw new IllegalArgumentException("燃料不足最低阈值!");}}}
}// 使用示例:组装歼星舰
SpaceShip deathStar = new SpaceShip.Builder("超物质引擎", 5000).weaponSystem("超级激光炮").escapePod(true).aiCore("天网").build();

模式优势

  • 强制必选参数校验
  • 可选参数灵活组合
  • 构建过程线程安全
  • 参数顺序无关性

二、现代建造师进化指南

2.1 流式接口(Fluent API)

// 咖啡订单构建器
public class Coffee {private String size;private boolean milk;private int sugar;private String extra;public static class Builder {private Coffee coffee = new Coffee();public Builder size(String size) {coffee.size = size;return this;}public Builder milk(boolean milk) {coffee.milk = milk;return this;}public Builder sugar(int cubes) {coffee.sugar = cubes;return this;}public Builder extra(String item) {coffee.extra = item;return this;}public Coffee brew() {if (coffee.size == null) {throw new IllegalStateException("必须选择杯型!");}return coffee;}}
}// 使用链式调用
Coffee myCoffee = new Coffee.Builder().size("大杯").milk(true).sugar(2).extra("焦糖").brew();

2.2 Lombok建造者(极简主义)

@Builder
@ToString
public class SmartPhone {@NonNullprivate String model;@Builder.Defaultprivate int ram = 8;     // 默认值@Builder.Defaultprivate int storage = 128;private boolean nfc;private String color;
}// 自动生成建造者
SmartPhone phone = SmartPhone.builder().model("XPhone 15").ram(12).color("星际黑").build();

三、高级建造工厂

3.1 泛型建造者

// 通用建造者接口
public interface Builder<T> {T build();
}// 房屋建造实现
public class HouseBuilder implements Builder<House> {private House house = new House();public HouseBuilder addRooms(int rooms) {house.setRooms(rooms);return this;}public HouseBuilder addPool() {house.setHasPool(true);return this;}@Overridepublic House build() {return house;}
}// 导演类控制建造流程
public class Architect {public House buildMansion(Builder<House> builder) {return ((HouseBuilder) builder).addRooms(10).addPool().build();}
}

3.2 线程安全建造者

public class ThreadSafePCBuilder {private volatile String cpu;private volatile String gpu;private volatile int ram;public synchronized ThreadSafePCBuilder setCpu(String cpu) {this.cpu = cpu;return this;}public synchronized ThreadSafePCBuilder setGpu(String gpu) {this.gpu = gpu;return this;}public synchronized ThreadSafePCBuilder setRam(int ram) {this.ram = ram;return this;}public PC build() {return new PC(cpu, gpu, ram);}
}

四、特殊建造技巧

4.1 组合建造者

// 组合汽车部件
public class CarBuilder {private EngineBuilder engineBuilder = new EngineBuilder();private WheelBuilder wheelBuilder = new WheelBuilder();public CarBuilder withV8Engine() {engineBuilder.setType("V8");return this;}public CarBuilder withSportWheels() {wheelBuilder.setType("Sport");return this;}public Car build() {return new Car(engineBuilder.build(), wheelBuilder.build());}
}// 创建跑车
Car sportsCar = new CarBuilder().withV8Engine().withSportWheels().build();

4.2 分阶段建造

// 分阶段接口
public interface Stage1 {Stage2 setCPU(String cpu);
}public interface Stage2 {Stage3 setGPU(String gpu);
}public interface Stage3 {PCBuilder setRAM(int ram);
}public class PCBuilder implements Stage1, Stage2, Stage3 {// 强制按顺序配置@Overridepublic Stage2 setCPU(String cpu) { /*...*/ }@Overridepublic Stage3 setGPU(String gpu) { /*...*/ }@Overridepublic PC build() { /*...*/ }
}// 确保正确配置顺序
PC gamingPC = new PCBuilder().setCPU("i9").setGPU("RTX 4090").setRAM(64).build();

五、Spring中的建造者模式

5.1 结合工厂模式

@Configuration
public class Config {@Bean@Scope("prototype")public PizzaBuilder pizzaBuilder() {return new PizzaBuilder();}
}@Service
public class PizzaService {private final PizzaBuilder builder;public PizzaService(PizzaBuilder builder) {this.builder = builder;}public Pizza createSpecialPizza() {return builder.size("XL").crust("芝士卷边").topping("双份芝士").build();}
}

5.2 配置类建造者

@ConfigurationProperties(prefix = "mail")
public class MailConfig {private String host;private int port;// Builder生成配置对象public static MailConfigBuilder builder() {return new MailConfigBuilder();}
}// application.yml配置
mail:host: smtp.example.comport: 587

建造者模式选择指南

实现方式适用场景优点缺点
传统Builder需要严格校验的复杂对象线程安全,强校验代码量大
流式接口可选参数多的配置类调用直观,易扩展无法强制必选参数
Lombok Builder快速开发简单DTO代码极简灵活性受限
泛型建造者需要统一构建接口的系统提高代码复用率类型转换需要处理
分阶段建造必须按步骤配置的对象保证配置顺序使用复杂度稍高

终章:建造者的宇宙法则

当你面对以下场景时,请召唤建造者模式:

  1. 对象包含多个可选参数(超过4个参数)
  2. 需要不同组合的构造方式
  3. 要求对象不可变(Immutable)
  4. 需要分步构造复杂对象

禁忌时刻

  • 当对象非常简单(3个以下参数)时
  • 当构造过程不需要灵活性时
  • 当性能要求极高(纳秒级)的场景

最后,记住一位资深架构师的名言:“建造者模式不是为了炫技,而是为了在复杂性与可维护性之间找到完美平衡。”

创作挑战
如果要实现一个支持撤销操作的建造者(比如用户可以回退到上一步配置),如何设计这样的建造者结构?把你的设计草图留在评论区吧!🚀👩💻

http://www.dtcms.com/a/295326.html

相关文章:

  • React+threejs两种3D多场景渲染方案
  • STM32 HAL库 HAL_TIM_OC_Stop函数详细解释
  • 期待更好的发展
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • 亲测有效:EPLAN导出CAD图纸,DWG文件里的图纸复制粘贴出错和无法编辑的解决方法
  • EIDE 创建基于STM32-HD的项目快速创建流程
  • 精通Python PDF裁剪:从入门到专业的三重境界
  • 回调后门 函数
  • 微信格式插件 建的文件位置
  • 边缘智能体:轻量化部署与离线运行
  • MIT线性代数02_矩阵消元
  • C语言实现BIOS定义的WMI调用
  • NumPy 线性代数
  • 分布式推客系统开发全解:微服务拆分、佣金结算与风控设计
  • Sklearn 机器学习 数值标准化
  • 变量和函数底层工作原理
  • Mysql常用武功招式
  • 大脑各脑区功能解析:从痛觉处理到动作执行的协作机制
  • runc源码解读(一)——runc create
  • 技术赋能与体验升级:高端网站建设的核心要义
  • 【VSCode】复制到下一行快捷键
  • SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理
  • 【分布式锁】什么是分布式锁?分布式锁的作用?
  • Windows计算器项目全流程案例:从需求到架构到实现
  • 宝塔通过docker部署JupyterHub指南【常见错误处理】
  • 深入解析文件操作(下)- 文件的(顺序/随机)读写,文件缓冲区,更新文件
  • 【AI】Jupyterlab中数据集的位置和程序和Pycharm中的区别
  • 20-ospf技术
  • MIT线性代数01_方程组的几何解释
  • 绿色转向的时代红利:创新新材如何以技术与标准主导全球铝业低碳重构