# Java 构建器设计模式

> 原文： [https://javatutorial.net/java-builder-design-pattern](https://javatutorial.net/java-builder-design-pattern)

在这里，我们将讨论 Java 构建器设计模式，以及在何处以及如何使用它。

这种设计模式也称为创建设计模式，用于从简单对象创建和配置复杂对象。 因此，基本上，它可以帮助我们在生成复杂对象的同时编写可读性，可管理性和可理解性的代码。

构建器模式生成一个构建对象，该构建对象用于构建称为产品的复杂对象。 为了给出教科书的定义，“构建器设计模式将复杂对象的构造与其表示分开，以便相同的构造过程可以创建不同的表示。”

[工厂设计模式](https://javatutorial.net/java-factory-design-pattern)也是一种创新设计模式。 在使用简单对象生成复杂对象时，必须严格遵循分步方法。 创建此设计模式是为了解决当对象包含许多属性时工厂和抽象工厂设计模式所产生的问题。

## 我们通常在哪里使用构建器设计模式？

*   当需要对象的多种表示时
*   客户传递的论点太多
*   对象创建包含可选参数

这种类型的设计模式通常使用流畅的界面来实现。

## 构建器设计模式的实现

Java 中的每个类都有一个由用户显式设置或默认设置的构造函数。 当可以借助许多不同的参数（可能是强制性的，而其他参数也可能是可选的）创建对象时，将使用构建器模式。 在这种情况下，事情变得复杂并且容易出错。 因此，在这种情况下，构建器模式会派上用场。

实现构建器设计模式的步骤：

1.  使用所有必填字段创建一个构建器类
2.  `Builder`类应具有带有所有必需参数的公共构造函数
3.  创建方法以获取可选参数的值。 设置可选属性后，这些方法应返回相同的构建器对象。
4.  最后，在`Builder`类中提供一个`build()`方法，该方法将返回所需的对象。

让我们看一个编码示例，该示例说明在创建复杂对象时如何实现构建器模式。 我们考虑了一个学生数据收集系统，并创建了一个处理此类特定数据收集的`Student`类。 如图所示，已生成并实现了一个名为`StudentBuilder`的构建器类。

**让我们看一个例子**：

```java
public class Student {
    private int id;
    private String firstName;
    private String lastName;
    private int age;
    private String phone;
    private String address;
    private String course;

   public Student(StudentBuilder studentBuilder) {
        this.id = studentBuilder.id;
        this.firstName = studentBuilder.firstName;
        this.lastName = studentBuilder.lastName;

        this.age = studentBuilder.age;
        this.phone = studentBuilder.phone;
        this.address = studentBuilder.address;
        this.course = studentBuilder.course;
    }

    public int getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }

    public String getAddress() {
        return address;
    }

   public String getCourse() {
        return course;
    }

    @Override
    public String toString() {
        return "Student{" +
               "id=" + id +
               ", firstName='" + firstName + '\'' +
               ", lastName='" + lastName + '\'' +
               ", age=" + age +
               ", phone='" + phone + '\'' +
               ", address='" + address + '\'' +
              ", course='" + course + '\'' +
               '}';
    }

    public static class StudentBuilder {

        private int id;
        private String firstName;
        private String lastName;
        private int age;
        private String phone;
        private String address;
        private String course;

        public StudentBuilder(int id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public StudentBuilder withOptionalAge(int age) {
            this.age = age;
            return this;
        }

        public StudentBuilder withOptionalPhone(String phone) {
            this.phone = phone;
            return this;
        }

        public StudentBuilder withOptionalAddress(String address) {
            this.address = address;
            return this;
        }

        public Student buildStudent() {
            validateStudentData();
            return new Student(this);
        }

        private boolean validateStudentData() {
            //Validation process, check if student is registered in the database
            return true;
        }
    }
}

```

**在主要代码中使用构建器**：

```java
Student stu1 = new Student.StudentBuilder(12341, "Jack", "Harrison")
                .withOptionalAddress("Address")
                .withOptionalAge(21)
                .withOptionalPhone("874116073648")
                .buildStudent();
System.out.println("Student : " + stu1.toString());
Student stu2 = new Student.StudentBuilder(1225, "Diana", "Daniels")
                .withOptionalAge(18)
                .buildStudent();
System.out.println("Student : " + stu2);

```