欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 建造者模式(Builder Pattern):优雅地构建复杂对象

建造者模式(Builder Pattern):优雅地构建复杂对象

2025/4/29 20:04:39 来源:https://blog.csdn.net/weixin_45970964/article/details/144257779  浏览:    关键词:建造者模式(Builder Pattern):优雅地构建复杂对象

引言

在软件开发中,我们常常遇到需要创建复杂对象的场景。当一个对象有多个属性,且这些属性的组合可能非常多样时,传统的构造函数或工厂模式可能会显得笨拙。这就是建造者模式(Builder Pattern)发挥作用的地方。

建造者模式的核心概念

建造者模式是一种创建型设计模式,它能够将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

模式角色解析

建造者模式通常包含以下关键角色:

  1. 产品类(Product):最终要创建的复杂对象
  2. 抽象建造者(Builder):定义创建产品各个部件的抽象接口
  3. 具体建造者(ConcreteBuilder):实现抽象建造者,负责具体的构建过程
  4. 指挥者(Director):控制构建过程,但不直接涉及产品的细节

代码示例:以计算机配置为例

建造者模式计算机配置示例

// 产品角色(Product):计算机类
public class Computer {// 产品的复杂属性private String cpu;       // CPUprivate String memory;    // 内存private String mainBoard; // 主板private String hardDisk;  // 硬盘private String displayCard; // 显卡// 私有构造方法,只能通过建造者创建private Computer(ComputerBuilder builder) {this.cpu = builder.cpu;this.memory = builder.memory;this.mainBoard = builder.mainBoard;this.hardDisk = builder.hardDisk;this.displayCard = builder.displayCard;}@Overridepublic String toString() {return "Computer{" +"CPU='" + cpu + '\'' +", 内存='" + memory + '\'' +", 主板='" + mainBoard + '\'' +", 硬盘='" + hardDisk + '\'' +", 显卡='" + displayCard + '\'' +'}';}// 抽象建造者(Builder)接口:定义构建电脑各个部件的抽象接口public interface ComputerBuilder {// 定义构建各个部件的抽象方法ComputerBuilder cpu(String cpu);ComputerBuilder memory(String memory);ComputerBuilder mainBoard(String mainBoard);ComputerBuilder hardDisk(String hardDisk);ComputerBuilder displayCard(String displayCard);// 最终构建方法Computer build();}// 具体建造者(ConcreteBuilder):游戏电脑建造者public static class GamingComputerBuilder implements ComputerBuilder {// 具体建造者内部持有一个产品实例private String cpu;private String memory;private String mainBoard;private String hardDisk;private String displayCard;@Overridepublic GamingComputerBuilder cpu(String cpu) {this.cpu = cpu;return this;}@Overridepublic GamingComputerBuilder memory(String memory) {this.memory = memory;return this;}@Overridepublic GamingComputerBuilder mainBoard(String mainBoard) {this.mainBoard = mainBoard;return this;}@Overridepublic GamingComputerBuilder hardDisk(String hardDisk) {this.hardDisk = hardDisk;return this;}@Overridepublic GamingComputerBuilder displayCard(String displayCard) {this.displayCard = displayCard;return this;}@Overridepublic Computer build() {return new Computer(this);}}// 指挥者(Director):电脑配置指导类public static class ComputerDirector {// 指挥者使用建造者构建复杂对象public static Computer createHighEndGamingComputer(ComputerBuilder builder) {return builder.cpu("Intel i9-13900K").memory("64GB DDR5").mainBoard("ASUS ROG Maximus").hardDisk("2TB PCIe 4.0 SSD").displayCard("NVIDIA RTX 4090").build();}public static Computer createOfficeComputer(ComputerBuilder builder) {return builder.cpu("Intel i5-13600K").memory("16GB DDR4").mainBoard("ASUS Pro WS").hardDisk("1TB SSD").displayCard("Integrated Graphics").build();}}// 客户端使用示例public static void main(String[] args) {// 使用具体建造者创建游戏电脑Computer gamingPC = new Computer.ComputerDirector().createHighEndGamingComputer(new GamingComputerBuilder());// 使用具体建造者创建办公电脑Computer officePC = new Computer.ComputerDirector().createOfficeComputer(new GamingComputerBuilder());System.out.println("游戏电脑配置:" + gamingPC);System.out.println("办公电脑配置:" + officePC);}
}

可以使用内部类的方式:

// 产品类:计算机
class Computer {private String cpu;private String memory;private String hardDisk;private String displayCard;public Computer(ComputerBuilder builder) {this.cpu = builder.cpu;this.memory = builder.memory;this.hardDisk = builder.hardDisk;this.displayCard = builder.displayCard;}@Overridepublic String toString() {return "Computer{" +"CPU='" + cpu + '\'' +", 内存='" + memory + '\'' +", 硬盘='" + hardDisk + '\'' +", 显卡='" + displayCard + '\'' +'}';}// 建造者内部类public static class ComputerBuilder {private String cpu;private String memory;private String hardDisk;private String displayCard;public ComputerBuilder cpu(String cpu) {this.cpu = cpu;return this;}public ComputerBuilder memory(String memory) {this.memory = memory;return this;}public ComputerBuilder hardDisk(String hardDisk) {this.hardDisk = hardDisk;return this;}public ComputerBuilder displayCard(String displayCard) {this.displayCard = displayCard;return this;}public Computer build() {return new Computer(this);}}
}// 使用示例
public class BuilderDemo {public static void main(String[] args) {Computer gamingComputer = new Computer.ComputerBuilder().cpu("Intel i9").memory("32GB").hardDisk("1TB SSD").displayCard("NVIDIA RTX 3080").build();System.out.println(gamingComputer);}
}

建造者模式 vs 工厂模式

主要区别

  1. 目的不同
    • 工厂模式主要关注对象的创建
    • 建造者模式关注复杂对象的分步骤构建
  2. 构建灵活性
    • 工厂模式通常一次性创建完整对象
    • 建造者模式允许逐步配置对象,更加灵活
  3. 使用场景
    • 工厂模式适合创建简单对象
    • 建造者模式适合创建有多个部件,且配置复杂的对象

典型应用场景

  1. 构建复杂的配置对象
  2. 需要创建不可变对象
  3. 对象有大量可选参数
  4. 构建过程相对固定,但细节可变

优缺点分析

优点

  • 将复杂对象的构建和表示解耦
  • 提供更精细的控制构建过程
  • 链式调用使代码更加清晰

缺点

  • 会增加代码的复杂度
  • 对于简单对象可能会显得过度设计

结语

建造者模式是构建复杂对象的利器,它通过将对象构建的复杂逻辑封装起来,提供了一种优雅且灵活的对象创建方式。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词