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

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方法创建对象。

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

相关推荐
2301_322414280429 分钟前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工3 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop3 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x4 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事4 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客5 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1885 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn5 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su6 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划