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

java设计模式:建造者模式

建造者模式的核心优势在于它能优雅地处理复杂对象的创建,特别是在对象包含多个部件或配置选项时。
下面我用具体的Java例子来展示它的强大之处。

🏗️ 经典建造者模式:组装电脑

标准

1. 产品类(Product) - Computer​​

表示最终要构建的复杂对象。

public class Computer {private String cpu;private String memory;private String storage;// 设置方法public void setCpu(String cpu) { this.cpu = cpu; }public void setMemory(String memory) { this.memory = memory; }public void setStorage(String storage) { this.storage = storage; }@Overridepublic String toString() {return "Computer [cpu=" + cpu + ", memory=" + memory + ", storage=" + storage + "]";}
}

​​2. 抽象建造者(Builder) - ComputerBuilder​​

定义构建产品各部分的接口。

public interface ComputerBuilder {void setCPU(String cpu);void setMemory(String memory);void setStorage(String storage);Computer build(); // 返回构建好的产品
}

​​3. 具体建造者(ConcreteBuilder) - StandardComputerBuilder​​

实现抽象建造者接口,负责具体的构建逻辑。

public class StandardComputerBuilder implements ComputerBuilder {private Computer computer;public StandardComputerBuilder() {this.computer = new Computer();}@Overridepublic void setCPU(String cpu) {computer.setCpu(cpu);}@Overridepublic void setMemory(String memory) {computer.setMemory(memory);}@Overridepublic void setStorage(String storage) {computer.setStorage(storage);}@Overridepublic Computer build() {return computer; // 返回构建好的Computer对象}
}

​​4. 指挥者(Director)​​

负责控制构建过程(顺序、逻辑)。客户端通常与指挥者交互。
public class Director {public Computer buildCustomComputer(ComputerBuilder builder) {builder.setCPU("Intel i7");builder.setMemory("16GB");builder.setStorage("1TB SSD");return builder.build();}
}

5. ​​客户端使用​​

public class Main{public static void main(String[] args) {ComputerBuilder builder = new StandardComputerBuilder();Director director = new Director();Computer computer = director.buildCustomComputer(builder);System.out.println(computer); // 输出: Computer [cpu=Intel i7, memory=16GB, storage=1TB SSD]}
}

变体

1. 产品类(Computer)

public class Computer {private String cpu;private String ram;private String storage;private String gpu;private String powerSupply;// 私有构造函数,只能通过Builder构建private Computer(ComputerBuilder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.gpu = builder.gpu;this.powerSupply = builder.powerSupply;}// Getters and toString()public String getCpu() { return cpu; }public String getRam() { return ram; }public String getStorage() { return storage; }public String getGpu() { return gpu; }public String getPowerSupply() { return powerSupply; }@Overridepublic String toString() {return "Computer{cpu='" + cpu + "', ram='" + ram + "', storage='" + storage + "', gpu='" + gpu + "', powerSupply='" + powerSupply + "'}";}
}

2. 建造者类 Builder(静态内部类)

// 在Computer类内部添加Builder静态内部类
public static class ComputerBuilder {private String cpu;private String ram;private String storage;private String gpu;private String powerSupply;// 必需参数通过构造函数传入public ComputerBuilder(String cpu, String ram, String storage) {this.cpu = cpu;this.ram = ram;this.storage = storage;}// 可选参数使用方法链设置public ComputerBuilder setGpu(String gpu) {this.gpu = gpu;return this;}public ComputerBuilder setPowerSupply(String powerSupply) {this.powerSupply = powerSupply;return this;}public Computer build() {// 可以在此处进行参数验证if (cpu == null || ram == null || storage == null) {throw new IllegalStateException("必需参数不能为空");}return new Computer(this);}
}

3. 客户端使用

public class Main{public static void main(String[] args) {// 创建游戏电脑(包含所有可选部件)Computer gamingComputer = new Computer.ComputerBuilder("Intel i9", "32GB", "1TB SSD").setGpu("NVIDIA RTX 4090").setPowerSupply("1000W").build();System.out.println("游戏电脑: " + gamingComputer);// 创建办公电脑(只包含必需部件)Computer officeComputer = new Computer.ComputerBuilder("Intel i5", "16GB", "512GB SSD").build(); // 不设置可选参数System.out.println("办公电脑: " + officeComputer);// 创建部分配置的电脑Computer developerComputer = new Computer.ComputerBuilder("AMD Ryzen 7", "64GB", "2TB NVMe").setGpu("NVIDIA RTX 3070").build(); // 不设置电源,使用默认值System.out.println("开发电脑: " + developerComputer);}
}

✨ 建造者模式的优势体现

5. ​​解决构造方法爆炸问题​​
没有建造者模式时,你可能需要多个重载的构造函数:

// 反例:构造方法爆炸
new Computer("i7", "16GB", "512GB", null, null);
new Computer("i7", "16GB", "512GB", "RTX3080", null);
new Computer("i7", "16GB", "512GB", null, "750W");
// ... 更多组合

建造者模式让代码​​可读性极高​​,每个参数的用途一目了然。

6. ​​灵活处理可选参数​​
建造者模式优雅地处理了可选参数问题。在例子中,GPU和电源是可选的,客户端可以自由选择是否设置这些参数,避免了传递null值的尴尬。

7. ​​保证对象创建的一致性​​
在build()方法中可以添加验证逻辑,确保创建的对象是有效的:

public Computer build() {if (cpu == null || ram == null || storage == null) {throw new IllegalStateException("CPU、RAM和Storage是必需参数");}if (gpu != null && powerSupply == null) {throw new IllegalStateException("配置独立显卡必须指定电源");}return new Computer(this);
}

8. ​​支持复杂构建流程​​
对于更复杂的场景,可以引入Director(指挥者)来封装常见的构建模式:

public class ComputerDirector {public static Computer buildGamingComputer() {return new Computer.ComputerBuilder("Intel i9", "32GB", "1TB NVMe").setGpu("NVIDIA RTX 4090").setPowerSupply("1200W").build();}public static Computer buildOfficeComputer() {return new Computer.ComputerBuilder("Intel i5", "8GB", "256GB SSD").build();}
}

🎯 实际应用场景
建造者模式在Java生态中广泛应用:

​​Android开发​​:AlertDialog.Builder

​​Java标准库​​:StringBuilder

​​框架配置​​:Spring Boot的属性配置、MyBatis的配置构建等

这种模式特别适用于创建需要多个步骤或包含多个配置选项的复杂对象,它能显著提高代码的可读性、可维护性和灵活性。

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

相关文章:

  • 建设银行如何招聘网站动易网站 青春
  • Nginx 高级配置指南:Rewrite、If判断、浏览器分离与防盗链
  • 蓝桥杯嵌入式——基础模块的使用(初始化+调度器+LED+按键+LCD)
  • 厦门专业网站推广建站深圳建设集团是国企吗
  • web开发兼容注意
  • websocket网络通信协议
  • 佛山网站建设的大品牌wordpress远程写作
  • 网站建设的可用性yw55523can优物入口4虎
  • 如何将网站从建站服务商转移出来
  • 使用C#将Markdown转换为Word或PDF:高效文档转换的利器
  • 做淘宝优惠网站坪山网站建设行情
  • c 做网站流程做视频网站的空间
  • 2025 随身 WiFi 行业报告:格行 WiFi6 技术下放百元市场,中兴华为机型竞争力分析;五款机型芯片方案 / 网速 / 质保深度横评
  • Hi3861 OpenHarmony鸿蒙开发(嵌入式方向) (一)
  • Python常用内建模块——XML
  • mapper.xml中limit分页参数不能使用计算表达式问题
  • 精读C++设计模式20 —— 结构型设计模式:桥接模式
  • AI+传统工作流:Photoshop/Excel的智能插件开发指南
  • 冀州网站制作沈阳网站建设索王道下拉
  • java设计模式:抽象工厂模式 + 建造者模式
  • ps做 网站教程服装花型图案设计网站
  • 指令集、立即数和伪指令
  • 危机领导力:突发事件中的决策与沟通策略
  • Unity学习之垃圾回收GC
  • 五次样条速度规划方法介绍
  • 找人做网站被骗怎么办wordpress 评论 姓名
  • 如何建立公司企业网站社区网站建设方案ppt
  • 解密C++多态:一篇文章掌握精髓
  • Git 进阶指南:深入掌握 git log 查看提交历史
  • C++ 引用协程