实现构建器模式的 Java 最佳方法

2022-09-03 14:48:59

以下哪项是实现生成器模式的更好方法?

1) 使用对象进行构建,而不是在构建器中构建其所有属性(并在构建器构造函数中创建它):

public class Person {
    private String firstName;
    // other properties ...

    private Person() {}

    // getters ...

    public static class Builder {
        // person object instead of all the person properties
        private Person person;

        public Builder() {
            person = new Person();
        }

        public Builder setFirstName(String firstName) {
            person.firstName = firstName;

            return this;
        }

        // other setters ...

        public Person build() {
            if (null == person.firstName) {
                throw new IllegalStateException("Invalid data.");
            }

            return person;
        }
    }
}

2) 使用对象的属性进行构建,而不是直接在构建器中构建对象(并在 build() 方法中创建它):

public class Person {
    private String firstName;
    // other properties ...

    private Person() {}

    // getters ...

    public static class Builder {
        // person properties instead of object
        private String firstName;
        // other properties ...

        public Builder() {}

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;

            return this;
        }

        // other setters ...

        public Person build() {
            if (null == this.firstName) {
                throw new IllegalStateException("Invalid data.");
            }

            Person person = new Person();
            person.firstName = firstName;

            return person;
        }
    }
}

我更喜欢第一种方法,因为我认为在构建器中重复它们有很多属性是多余的。第一种方法是否有一些缺点?

提前感谢,抱歉我的英语不好。


答案 1

小说明:是的,属性可能是重复的,但它们有优势

详细信息如下:如果您在此处查看详细信息。

Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);

这里的问题是,由于对象是通过多次调用创建的,因此在构造过程中它可能处于不一致的状态。这也需要大量的额外努力来确保线程安全。

更好的替代方法是使用生成器模式。

请注意生成器和相应构造函数或父 Pizza 类中的方法 - 此处链接中的完整代码

 public static class Builder {

    public Pizza build() {    // Notice this method
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {  // Notice this Constructor
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }

答案 2

这种模式在“四人帮”设计模式“一书中已经描述过,该书说:Builder

生成器模式是一种设计模式,它允许使用正确的操作序列分步创建复杂对象。构造由控制器对象控制,该对象只需要知道要创建的对象类型。

如果在构造对象时需要遵循一系列步骤,则选择第二个选项。

在第一个选项中,不会控制正确的操作序列。如果未定义操作序列,则可以选择任一选项。


推荐