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

1.概念

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

2.作用

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

3.应用场景

当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:

使用有参构造器一次完成创建与初始化操作

使用构造器完成创建工作,使用set方法完成初始化操作

但上面两个方法都会有相同的问题------代码量太大,可读性差。

所以这个时候我们可以使用建造者模式。

4.特点

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

5.类与对象关系

有以下角色:

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

6.实现

假设我们现在要创建一个产品------Computer

它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)

java 复制代码
// 产品类: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类(指挥者)(可选)

java 复制代码
// 指挥者类(可选)  
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();  
    }  
  
    // 其他构建方法可以根据需要添加  
}

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

测试类

java 复制代码
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方法创建对象。

使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。

相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨8 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4048 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空8 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0019 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤9 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式