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

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

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

相关推荐
郑州光合科技余经理4 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
耀耀_很无聊4 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
奶油话梅糖4 小时前
锐捷常用命令速查表
java·网络·windows
code_std4 小时前
java WebSocket 使用
java·开发语言·websocket
落叶-IT5 小时前
Java Scanner 类精讲:控制台交互
java·开发语言
chh5635 小时前
C++--string
java·开发语言·网络·c++·学习
Listen·Rain5 小时前
向量化详解
java·人工智能·spring·机器学习·ai
想你依然心痛5 小时前
AUTOSAR Classic Platform架构解析:BSW、RTE与ASW——分层、配置、代码生成
java·架构·实时互动
梦想的旅途25 小时前
企业微信外部群智能自动回复:基于RPA接口的关键词匹配方案
java·开发语言·数据库·机器人·自动化·企业微信
娇气的红酒5 小时前
关于.NET VS JavaEE平台争论的沉思录
java·java-ee·.net