目录
Why Use the Builder Pattern?
Create the Main Class (Product)
Implement the Static Builder Class
Use the Builder to Create Objects
首页 Java java教程 如何在Java中使用构建器设计模式

如何在Java中使用构建器设计模式

Oct 06, 2025 am 06:08 AM

Builder模式通过分离对象的构造与表示,解决多参数构造的可读性问题,适用于Java中含必选与可选字段的复杂对象创建,如Computer类;通过嵌套静态Builder类实现链式调用,确保代码清晰、灵活且易维护。

How to use the builder design pattern in java

The Builder design pattern is a creational pattern that allows you to construct complex objects step by step. It's especially useful in Java when an object has many optional parameters or requires a clear, readable way to instantiate it without relying on numerous constructors. This pattern separates the construction of an object from its representation, allowing the same construction process to create different representations.

Why Use the Builder Pattern?

When a class has several fields—some mandatory, some optional—using a constructor with many parameters becomes hard to read and maintain (often called the "telescoping constructor" problem). The Builder pattern provides a clean, fluent API for object creation.

Example scenario: Imagine a Computer class with required fields like CPU and RAM, and optional ones like GPU, storage, monitor, etc.

Create the Main Class (Product)

Define the class you want to build. Make it immutable by using private final fields and no setters.

Here’s how the Computer class might look:

<font face="monospace">
public class Computer {
    private final String cpu;
    private final String ram;
    private final String gpu;
    private final String storage;
    private final String monitor;

    // Private constructor
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.gpu = builder.gpu;
        this.storage = builder.storage;
        this.monitor = builder.monitor;
    }

    // Getters
    public String getCpu() { return cpu; }
    public String getRam() { return ram; }
    public String getGpu() { return gpu; }
    public String getStorage() { return storage; }
    public String getMonitor() { return monitor; }

    @Override
    public String toString() {
        return "Computer{"  
                "cpu='"   cpu   '\''  
                ", ram='"   ram   '\''  
                ", gpu='"   gpu   '\''  
                ", storage='"   storage   '\''  
                ", monitor='"   monitor   '\''  
                '}';
    }
}
</font>

Implement the Static Builder Class

Nest a static Builder class inside the main class. It holds the same fields and provides setter-like methods that return this, enabling method chaining.

Add a build() method that returns a new instance of the outer class.

<font face="monospace">
public static class Builder {
    private String cpu;
    private String ram;
    // Optional fields
    private String gpu = "integrated";
    private String storage = "512GB SSD";
    private String monitor = "none";

    public Builder(String cpu, String ram) {
        this.cpu = cpu;
        this.ram = ram;
    }

    public Builder gpu(String gpu) {
        this.gpu = gpu;
        return this;
    }

    public Builder storage(String storage) {
        this.storage = storage;
        return this;
    }

    public Builder monitor(String monitor) {
        this.monitor = monitor;
        return this;
    }

    public Computer build() {
        return new Computer(this);
    }
}
</font>

Use the Builder to Create Objects

Now you can create instances in a readable, flexible way:

<font face="monospace">
Computer gamingPc = new Computer.Builder("i9", "32GB")
    .gpu("RTX 4080")
    .storage("2TB NVMe")
    .monitor("4K")
    .build();

Computer officeLaptop = new Computer.Builder("i5", "16GB")
    .storage("512GB SSD")
    .build();

System.out.println(gamingPc);
System.out.println(officeLaptop);
</font>

This approach makes code easier to read and prevents errors from misordered constructor arguments. You also enforce required fields via the Builder’s constructor while keeping optionals configurable.

Basically, the Builder pattern improves clarity and flexibility when creating complex objects in Java. It's widely used in frameworks and libraries—like StringBuilder, AlertDialog.Builder in Android, and various DTOs or configuration objects.

以上是如何在Java中使用构建器设计模式的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

如何在Java中创建文件 如何在Java中创建文件 Sep 21, 2025 am 03:54 AM

UseFile.createNewFile()tocreateafileonlyifitdoesn’texist,avoidingoverwriting;2.PreferFiles.createFile()fromNIO.2formodern,safefilecreationthatfailsifthefileexists;3.UseFileWriterorPrintWriterwhencreatingandimmediatelywritingcontent,withFileWriterover

如何在Java中的类Path中添加JAR文件? 如何在Java中的类Path中添加JAR文件? Sep 21, 2025 am 05:09 AM

使用-cp参数可将JAR加入类路径,使JVM能加载其内类与资源,如java-cplibrary.jarcom.example.Main,支持多JAR用分号或冒号分隔,也可通过CLASSPATH环境变量或MANIFEST.MF配置。

如何在Java中实现接口? 如何在Java中实现接口? Sep 18, 2025 am 05:31 AM

使用implements关键字实现接口,类需提供接口中所有方法的具体实现,支持多接口时用逗号分隔,确保方法为public,Java8后默认和静态方法无需重写。

使用Java服务提供商界面(SPI)构建可扩展应用程序 使用Java服务提供商界面(SPI)构建可扩展应用程序 Sep 21, 2025 am 03:50 AM

JavaSPI是JDK内置的服务发现机制,通过ServiceLoader实现面向接口的动态扩展。1.定义服务接口并在META-INF/services/下创建以接口全名为名的文件,写入实现类全限定名;2.使用ServiceLoader.load()加载实现类,JVM会自动读取配置并实例化;3.设计时应明确接口契约、支持优先级与条件加载、提供默认实现;4.应用场景包括多支付渠道接入和插件化校验器;5.注意性能、类路径、异常隔离、线程安全和版本兼容性;6.在Java9 可结合模块系统使用provid

深入理解HTTP持久连接:在同一Socket上发送多个请求的策略与实践 深入理解HTTP持久连接:在同一Socket上发送多个请求的策略与实践 Sep 21, 2025 pm 01:51 PM

本文深入探讨了在同一TCP Socket上发送多个HTTP请求的机制,即HTTP持久连接(Keep-Alive)。文章澄清了HTTP/1.x与HTTP/2协议的区别,强调了服务器端对持久连接支持的重要性,以及如何正确处理Connection: close响应头。通过分析常见错误和提供最佳实践,旨在帮助开发者构建高效且健壮的HTTP客户端。

如何读取Java中的属性文件? 如何读取Java中的属性文件? Sep 16, 2025 am 05:01 AM

使用Properties类可轻松读取Java配置文件。1.将config.properties放入资源目录,通过getClassLoader().getResourceAsStream()加载并调用load()方法读取数据库配置。2.若文件在外部路径,使用FileInputStream加载。3.使用getProperty(key,defaultValue)处理缺失键并提供默认值,确保异常处理和输入验证。

了解Java仿制药和通配符 了解Java仿制药和通配符 Sep 20, 2025 am 01:58 AM

Javagenericsprovidecompile-timetypesafetyandeliminatecastingbyallowingtypeparametersonclasses,interfaces,andmethods;wildcards(?,?extendsType,?superType)handleunknowntypeswithflexibility.1.UseunboundedwildcardwhentypeisirrelevantandonlyreadingasObject

Java教程:如何扁平化嵌套ArrayList并将其元素填充到数组中 Java教程:如何扁平化嵌套ArrayList并将其元素填充到数组中 Sep 18, 2025 am 07:24 AM

本教程详细介绍了在Java中如何高效地处理包含其他ArrayList的嵌套ArrayList,并将其所有内部元素合并到一个单一的数组中。文章将通过Java 8 Stream API的flatMap操作,提供两种核心解决方案:先扁平化为列表再填充数组,以及直接创建新数组,以满足不同场景的需求。

See all articles