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

设计模式-创建型-建造者模式

1.概念

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

2.作用

用于简化对复杂对象的创建

3.应用场景

当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:
使用有参构造器一次完成创建与初始化操作
使用构造器完成创建工作,使用set方法完成初始化操作
但上面两个方法都会有相同的问题——代码量太大,可读性差。
所以这个时候我们可以使用建造者模式。

4.特点

对象的构建过程与表示分离

5.类与对象关系

有以下角色:

  • 产品:我们实际要创建和使用的复杂对象
  • 抽象建造者:一个用来约束具体建造者的接口
  • 具体建造者:实际完成对象的初始化操作
  • 指挥者(可选):提供一些默认情况下的初始化配置

6.实现

假设我们现在要创建一个产品——Computer
它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)

// 产品类:Computer
public class Computer {

  private String cpu;
  private String ram;
  private String storage;
  private String gpu;

  // 私有构造方法,防止外部直接实例化
  private Computer(Builder builder) {
    this.cpu = builder.cpu;
    this.ram = builder.ram;
    this.storage = builder.storage;
    this.gpu = builder.gpu;
  }

  // 内部静态Builder类(建造者)
  public static class Builder {

    private String cpu;
    private String ram;
    private String storage;
    private String gpu;

    // 设置CPU
    public Builder setCpu(String cpu) {
      this.cpu = cpu;
      return this;
    }

    // 设置RAM
    public Builder setRam(String ram) {
      this.ram = ram;
      return this;
    }

    // 设置存储
    public Builder setStorage(String storage) {
      this.storage = storage;
      return this;
    }

    // 设置GPU
    public Builder setGpu(String gpu) {
      this.gpu = gpu;
      return this;
    }

    // 构建Computer对象
    public Computer build() {
      return new Computer(this);
    }
  }

  @Override
  public String toString() {
    return (
      "Computer{" +
      "cpu='" +
      cpu +
      '\'' +
      ", ram='" +
      ram +
      '\'' +
      ", storage='" +
      storage +
      '\'' +
      ", gpu='" +
      gpu +
      '\'' +
      '}'
    );
  }
}

该例子中,我们可以看出:

  • 我们不能直接为Computer类的属性进行赋值,而是使用builder为其赋值
  • 在builder中进行赋值后从builder中取出值传递给Computer类,来完成初始化
  • 使用Builder类的各个set方法设置完属性后,使用build方法构建出对象

Director类(指挥者)(可选)

// 指挥者类(可选)  
public class ComputerDirector {  
    private Computer.Builder builder;  
  
    public ComputerDirector(Computer.Builder builder) {  
        this.builder = builder;  
    }  
  
    // 示例构建方法  
    public Computer constructGamingComputer() {  
        return builder  
                .setCpu("Intel i9")  
                .setRam("32GB")  
                .setStorage("1TB SSD")  
                .setGpu("NVIDIA RTX 3080")  
                .build();  
    }  
  
    // 其他构建方法可以根据需要添加  
}

指挥者类在这个例子中不是必须的,这里只是用来提供一些默认配置,让我们能更快的创建并初始化出一个对象

测试类

public class Main {  
    public static void main(String[] args) {  
        // 使用Builder直接构建  
        Computer gamingComputer = new Computer.Builder()  
                .setCpu("Intel i7")  
                .setRam("16GB")  
                .setStorage("512GB SSD")  
                .setGpu("NVIDIA RTX 3070")  
                .build();  
  
        System.out.println(gamingComputer);  
  
        // 使用Director构建(可选)  
        ComputerDirector director = new ComputerDirector(new Computer.Builder());  
        Computer highEndComputer = director.constructGamingComputer();  
  
        System.out.println(highEndComputer);  
    }  
}

正常使用建造者模式,我们需要使用Builder对象进行赋值,然后最终使用build方法创建对象。
使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。


http://www.kler.cn/a/408270.html

相关文章:

  • D73【 python 接口自动化学习】- python 基础之正则表达式
  • 2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究
  • ACP科普:约翰·科特变更
  • 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例
  • EWA Volume Splatting
  • 一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式
  • 设计模式——前端控制器模式
  • 用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)
  • 【前端】JavaScript 作用域全面解析
  • 【动态规划】“好数组”计数问题
  • y1重定义问题
  • 力扣刷题-excel表名称序列相转换
  • MyBatis---代理Dao方式的CRUD、MyBatis参数详解、MyBatis的配置文件
  • Tri Mode Ethernet MAC IP核详解
  • 摆烂仙君传——深度学习秘境奇缘
  • 网络爬虫总结与未来方向
  • maven传递性依赖的原则
  • Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统
  • C++ 中的模板特化和偏特化
  • R虚拟环境中安装ncdf4库包编译库问题
  • 骑砍2霸主MOD开发(29)-顶点动画
  • # DBeaver 连接hive数仓
  • 标贝科技大模型声音复刻 快速获取高品质专属AI声音
  • 【Rhino】【Python】Create a series of Blocks according to Value of object Property
  • 【042C】基于51RFID门禁系统(LCD12864显示)【Proteus仿真+Keil程序+报告+原理图】
  • Java基础:日期时间相关类