Java构建器设计模式

时间:2020-02-23 14:37:05  来源:igfitidea点击:

其中我们将讨论javabuilder设计模式,以及应该在何处以及如何使用它。

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

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

工厂设计模式也是一种创造性的设计模式。在使用简单对象生成复杂对象时,严格遵循一步一步的方法。该设计模式是为了解决对象由多个属性组成时工厂和抽象工厂设计模式所产生的问题。

我们通常其中使用builder设计模式?

当需要多个对象表示时

从客户端传递的参数太多

对象创建包含可选参数

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

builder设计模式的实现

Java中的每个类都有一个由用户显式或者默认设置的构造函数。当一个对象可以通过许多不同的参数(这些参数可能是强制的,而其他参数也可能是可选的)来创建时,使用Builder模式。在这种情况下,事情变得复杂,容易出错。所以,构建器模式在这种情况下很有用。

实现builder设计模式的步骤:

创建一个包含所有必需字段的生成器类

生成器类应该有一个带有所有必需参数的公共构造函数

创建方法以获取可选参数的值。在设置可选属性之后,这些方法应该返回相同的构建器对象。

最后在builder类中提供一个build()方法,该方法将返回所需的对象。

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

让我们看一个例子:

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;
      }
  }
}

主代码中生成器的使用:

Student stu1 = new Student.StudentBuilder(12341, "Hyman", "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);