Java建造者模式(Builder Pattern)详解与实践

news2025/6/8 18:03:52

一、引言

在软件开发中,我们经常会遇到需要创建复杂对象的场景。例如,构建一个包含多个可选参数的对象时,传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时,建造者模式(Builder Pattern)便成为一种优雅的解决方案。它通过分步骤构建对象,将对象的创建过程与其表示分离,从而提高代码的可读性和可维护性。


二、什么是建造者模式?

建造者模式(Builder Pattern)是一种创建型设计模式,其核心思想是通过分步骤构造复杂对象,最终返回一个完整的产品。它允许相同的构建过程创建不同的表示,同时避免构造函数参数过多的问题。

例如:Person person1=new Person(10个参数)

如果只需要其中3个的话,就得提供一个3个参数的构造函数

1.核心角色

  1. Product(产品):最终构建的复杂对象。
  2. Builder(抽象建造者):定义构建产品的抽象步骤。
  3. ConcreteBuilder(具体建造者):实现Builder接口,完成具体构建逻辑。
  4. Director(指挥者,可选):控制构建流程,协调建造者的步骤。

2.适用场景

  • 创建包含多个部件的复杂对象(如配置类、HTTP请求对象)。
  • 需要控制对象的创建过程(分步骤构建)。
  • 需要构建不同表示的对象(相同构建过程,不同实现)。
  • 希望避免构造器参数过多(解决“伸缩构造函数”问题)。

三、代码示例:

1.电脑

⑴.产品 (Product)Computer类表示要构建的电脑

产品提供每个字段的set方法

// 产品类:电脑
public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String graphicsCard;
    private String monitor;
    private String keyboard;
    private String mouse;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public void setGraphicsCard(String graphicsCard) {
        this.graphicsCard = graphicsCard;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", hardDisk='" + hardDisk + '\'' +
                ", graphicsCard='" + graphicsCard + '\'' +
                ", monitor='" + monitor + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", mouse='" + mouse + '\'' +
                '}';
    }
}    

⑵.抽象建造者 (Builder)ComputerBuilder接口定义了构建电脑各部分的方法

接口定义二次封装的构建方法

// 抽象建造者接口
public interface ComputerBuilder {
    void buildCPU();
    void buildMemory();
    void buildHardDisk();
    void buildGraphicsCard();
    void buildMonitor();
    void buildKeyboard();
    void buildMouse();
    Computer getComputer();
}    

⑶.具体建造者 (ConcreteBuilder)

GamingComputerBuilderOfficeComputerBuilder实现了抽象接口

// 具体建造者:游戏电脑建造者
public class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCPU() {
        computer.setCpu("Intel i9-12900K");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("32GB DDR5 5200MHz");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("2TB NVMe SSD");
    }

    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("NVIDIA RTX 4090");
    }

    @Override
    public void buildMonitor() {
        computer.setMonitor("4K 144Hz Gaming Monitor");
    }

    @Override
    public void buildKeyboard() {
        computer.setKeyboard("Mechanical Gaming Keyboard");
    }

    @Override
    public void buildMouse() {
        computer.setMouse("High Precision Gaming Mouse");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}    

// 具体建造者:办公电脑建造者
public class OfficeComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCPU() {
        computer.setCpu("Intel i5-12400");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("16GB DDR4 3200MHz");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("512GB NVMe SSD");
    }

    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("Integrated Graphics");
    }

    @Override
    public void buildMonitor() {
        computer.setMonitor("24-inch Full HD Monitor");
    }

    @Override
    public void buildKeyboard() {
        computer.setKeyboard("Wireless Keyboard");
    }

    @Override
    public void buildMouse() {
        computer.setMouse("Wireless Mouse");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}    

⑷.指挥者 (Director)

ComputerDirector控制构建过程的顺序

// 指挥者:电脑装配指导
public class ComputerDirector {
    private ComputerBuilder computerBuilder;

    public ComputerDirector(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public void setComputerBuilder(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public Computer constructComputer() {
        computerBuilder.buildCPU();
        computerBuilder.buildMemory();
        computerBuilder.buildHardDisk();
        computerBuilder.buildGraphicsCard();
        computerBuilder.buildMonitor();
        computerBuilder.buildKeyboard();
        computerBuilder.buildMouse();
        return computerBuilder.getComputer();
    }
}    

⑸.测试

// 演示程序
public class BuilderPatternDemo {
    public static void main(String[] args) {
        // 创建具体建造者
        ComputerBuilder gamingBuilder = new GamingComputerBuilder();
        ComputerBuilder officeBuilder = new OfficeComputerBuilder();

        // 创建指挥者并指定建造者
        ComputerDirector director = new ComputerDirector(gamingBuilder);

        // 构建游戏电脑
        Computer gamingComputer = director.constructComputer();
        System.out.println("游戏电脑配置:");
        System.out.println(gamingComputer);

        // 切换为办公电脑建造者
        director.setComputerBuilder(officeBuilder);

        // 构建办公电脑
        Computer officeComputer = director.constructComputer();
        System.out.println("\n办公电脑配置:");
        System.out.println(officeComputer);
    }
}    

2.建造一座房屋

以下是一个完整、简单且可运行的Java代码示例,演示如何通过建造者模式构建一个House对象。

⑴. 产品类(Product)

public class House {
    private final String walls;
    private final String roof;
    private final String windows;

    // 私有构造函数,防止外部直接创建
    private House(Builder builder) {
        this.walls = builder.walls;
        this.roof = builder.roof;
        this.windows = builder.windows;
    }

    @Override
    public String toString() {
        return "House{" +
                "walls='" + walls + '\'' +
                ", roof='" + roof + '\'' +
                ", windows='" + windows + '\'' +
                '}';
    }

    // 静态内部类:建造者
    public static class Builder {
        private String walls;
        private String roof;
        private String windows;

        // 设置墙壁
        public Builder setWalls(String walls) {
            this.walls = walls;
            return this;
        }

        // 设置屋顶
        public Builder setRoof(String roof) {
            this.roof = roof;
            return this;
        }

        // 设置窗户
        public Builder setWindows(String windows) {
            this.windows = windows;
            return this;
        }

        // 构建并返回House对象
        public House build() {
            return new House(this);
        }
    }
}

⑵.客户端调用(直接使用建造者)

public class Client {
    public static void main(String[] args) {
        // 使用建造者模式构建一座房屋
        House house = new House.Builder()
                .setWalls("Brick")
                .setRoof("Tile")
                .setWindows("Double Glazed")
                .build();

        System.out.println(house);
    }
}

⑶.可选:指挥者类(Director)

如果构建流程较为固定,可以通过Director类封装构建逻辑:

public class Director {
    // 构建标准房屋
    public House constructStandardHouse() {
        return new House.Builder()
                .setWalls("Concrete")
                .setRoof("Asphalt")
                .setWindows("Single Glazed")
                .build();
    }

    // 构建豪华房屋
    public House constructLuxuryHouse() {
        return new House.Builder()
                .setWalls("Stone")
                .setRoof("Wood")
                .setWindows("Triple Glazed")
                .build();
    }
}

⑷.客户端调用(通过Director)

public class ClientWithDirector {
    public static void main(String[] args) {
        Director director = new Director();
        House standardHouse = director.constructStandardHouse();
        House luxuryHouse = director.constructLuxuryHouse();

        System.out.println("Standard House: " + standardHouse);
        System.out.println("Luxury House: " + luxuryHouse);
    }
}

四、实际应用场景

建造者模式在Java生态中广泛应用于以下场景:

  • Java内置类StringBuilder的链式调用(如append()方法)。
  • 复杂对象构建:如HTTP请求对象、数据库查询构建器。
  • 配置类:例如,构建一个包含多个可选参数的配置对象。

五、总结

建造者模式通过分步骤构建复杂对象,将对象的创建过程与表示分离,解决了构造函数参数过多、代码臃肿的问题。通过链式调用和可选参数的支持,它提高了代码的可读性和可维护性。在实际开发中,无论是构建一个简单的房屋对象,还是处理复杂的业务需求,建造者模式都能提供清晰的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win32相关(IAT HOOK)

IAT HOOK 什么是IAT Hook? IAT Hook(Import Address Table Hook,导入地址表钩子)是一种Windows平台下的API钩取技术,通过修改目标程序的导入地址表(IAT)来拦截和重定向API调用 在我们之前学习pe文件结构的导入表时&am…

零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 TCP服务器通信配置与交互 3.1 硬件连接 3.2 开启TCP服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 TCP是TCP/IP体系中的传输层协议,全称为Transmiss…

ESP32开发之LED闪烁和呼吸的实现

硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下: 只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间…

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践

项目背景:近年来,云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高,网络安全的风险不断累积,金融证券行业面临着越来越多的威胁挑战。特别是近年以来,开源…

WebRTC通话原理与入门难度实战指南

波煮的实习公司主要是音视频业务,所以最近在补习WebRTC的相关内容,会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商:彼此要了解对方支持的媒体格式网络协商:彼此要了解对方的网络情况,这样才…

N元语言模型 —— 一文讲懂!!!

目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 ​编辑 1.Good-Turing 估计 ​编辑 2.Back-off (后备/后退)方法 3.绝对减值法 ​编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可…

Mac 安装git心路历程(心累版)

省流版:直接安装Xcode命令行工具即可,不用安Xcode。 git下载官网 第一部分 上网初步了解后,打算直接安装Binary installer,下载完安装时,苹果还阻止安装,只好在“设置–安全性与隐私”最下面的提示进行安…

计算机网络第2章(下):物理层传输介质与核心设备全面解析

目录 一、传输介质1.1 传输介质的分类1.2 导向型传输介质1.2.1 双绞线(Twisted Pair)1.2.2 同轴电缆(Coaxial Cable)1.2.3 光纤(Optical Fiber)1.2.4 以太网对有线传输介质的命名规则 1.3 非导向型传输介质…

C# 类和继承(扩展方法)

扩展方法 在迄今为止的内容中,你看到的每个方法都和声明它的类关联。扩展方法特性扩展了这个边 界,允许编写的方法和声明它的类之外的类关联。 想知道如何使用这个特性,请看下面的代码。它包含类MyData,该类存储3个double类型 的…

MySQL复杂SQL(多表联查/子查询)详细讲解

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 MySQL复杂SQL(多表联查/子查询&a…

STM32使用土壤湿度传感器

1.1 介绍: 土壤湿度传感器是一种传感装置,主要用于检测土壤湿度的大小,并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料,大面积5.0 * 4.0厘米,镀镍处理面。 它具有抗氧化&…

Windows平台RTSP/RTMP播放器C#接入详解

大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块,基于自研高性能内核,具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现,SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…

从 JDK 8 到 JDK 17:Swagger 升级迁移指南

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 随着 Java 生态向 JDK 17 及 Jakarta EE 的演进,许多项目面临从 JDK 8 升级的挑战,其中 Swagger(API 文档工具)的兼容性…

使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现

使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现(提供工作流) 摘要:本文基于一段关于使用 Coze 平台构建抖音爆火书单视频的详细讲解,总结出一套完整的 AI 视频自动化制作流程。内容涵盖从思路拆解、节点配…

【发布实录】云原生+AI,助力企业全球化业务创新

5 月 22 日,在最新一期阿里云「飞天发布时刻」,阿里云云原生应用平台产品负责人李国强重磅揭晓面向 AI 场景的云原生产品体系升级,通过弹性智能的一体化架构、开箱即用的云原生 AI 能力,为中国企业出海提供新一代技术引擎。 发布会…

LabVIEW主轴故障诊断案例

LabVIEW 开发主轴机械状态识别与故障诊断系统,适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法,实现从信号采集到故障定位的全流程自动化,为设备维护提供数据支撑,提升数控机床运行可靠性。 ​ 面向精密制造企业数控机…

计算机组成与体系结构:补码数制二(Complementary Number Systems)

目录 4位二进制的减法 补码系统 🧠减基补码 名字解释: 减基补码有什么用? 计算方法 ❓为什么这样就能计算减基补码 💡 原理揭示:按位减法,模拟总减法! 那对于二进制呢?&…

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例

上一节我们初步介绍MindFusion.Diagramming框架 C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型-CSDN博客 这里演示示例程序: 新建Windows窗体应用程序FlowDiagramDemo,将默认的Form1重命名为FormFlowDiagram. 右键FlowDiagramDemo管理NuGet程序包 输入MindFusio…