Java Builder模式

Jon*_*ary 7 java standards builder

我最近写了一个构建器类,并注意到标准似乎如下

public class PersonBuilder {
    private String firstName;
    private String lastName;

    public PersonBuilder withFirstName(String firstName) {
        this.firstName = firstName;
        return this;
    }

    public PersonBuilder withLastName(String lastName) {
        this.lastName = lastName;
        return this;
    }

    public Person build() {
        return new Person(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,做以下事情是否有任何不利之处

public class PersonBuilder {
    private Person person;

    public PersonBuilder withFirstName(String firstName) {
        person.setFirstName(firstName);
        return this;
    }

    public PersonBuilder withLastName(String lastName) {
        person.setLastName(lastName);
        return this;
    }

    public Person build() {
        return person;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个基于意见的问题,我只是在寻找任何答案,为什么这可能是一个坏的或更好的设计模式.

eth*_*far 5

您的方法存在一些问题.其中一些在之前的答案中有所描述,所以我只会提到其他答案.

您的设计的最大问题是您Person在构建器中使用单个实例.这意味着如果您不止一次使用同一个构建器,那么您将"构建"相同的实例,而使用它的客户端则需要两个不同的实例.无需提及这可能会对您的应用程序造成严重破坏.

你从@Basilevs得到的答案提到"建成"类需要setter.这是绝对正确的,但我想强调这是一个很大的问题,因为这意味着你"构建"的类永远不会是不可变的!换句话说,如果需要,您可以将这些类的实现者限制为使用同步来实现线程安全,以及使用通用方法可以避免的其他问题解决机制.