10

这可能是一个非常主观的问题,但我想知道更多的意见。我用 Spring MVC 构建了一个 Rest API 服务,并实现了 DTO-Domain-Entity 模式。我想知道您对在 DTO 中实现Builder 模式有何看法,例如

public class UserResponseDTO
    extends AbstractResponseDTO {

    private String username;
    private Boolean enabled;

    public UserResponseDTO(String username, Boolean enabled) {
        this.username = username;
        this.enabled = enabled;
    }

    public String getUsername() {
        return this.username;
    }

    public Boolean getEnabled() {
        return this.enabled;
    }

    public static class Builder {

        private String username;
        private Boolean enabled;

        public void setUsername(String username) {
            this.username = username;
        }

        public void setEnabled(Boolean enabled) {
            this.enabled = enabled;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }
}

根据定义:

Builder 设计模式的目的是将复杂对象的构造与其表示分离。通过这样做,相同的构造过程可以创建不同的表示。

在我的大多数 DTO 案例中(并不是说全部),我没有更复杂的对象来构建,例如这种情况。而且,老实说,如果我们谈论 DTO,我想不出任何构造复杂对象的例子。

有助于使不可变对象更易于使用并增加代码清晰度的模式之一是 Builder 模式。

构建器模式提供对象不变性。然后,我们可以认为 DTO 是服务响应本身,不应更改,因为这是一个响应(至少我是这么想的)


所以你怎么看?我应该对 DTO 使用这种模式吗(鉴于这种情况,可能是大多数情况,不满足复杂对象原则)?

4

1 回答 1

21

我的简短回答是,这是一个偏好问题。如果您喜欢 Builder Pattern 的工作方式,请应用它。对于这样一个小案例,我认为这两种方式都不重要。我个人的偏好是不要在这里使用 Builder,因为它似乎没有增加太多价值。

我更长的答案是,Builder Pattern 旨在促进更轻​​松地配置复杂对象,而无需求助于诸如伸缩构造函数之类的反模式。在这种情况下,无论哪种情况,您都没有反模式;这两种选择都相对较小且有效。

不过,当我们谈论偏好时,我更喜欢使用流畅界面的构建器模式的修改版本;每个方法都返回 Builder 的实例,以便方法调用可以链接在一起(而不是在单独的行上)。这类似于您链接的文章中的 Java 示例。

我会将您的构建器修改为如下所示:

public static class Builder {

        private String username;
        private Boolean enabled;

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

        public Builder setEnabled(Boolean enabled) {
            this.enabled = enabled;
            return this;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }

因此,使用构建器看起来像这样:

UserResponseDTO ur = new Builder().setUsername("user").setEnabled(true).build();

同样,只是个人喜好问题。

于 2015-08-04T20:16:53.447 回答