我实现构建器对象有什么缺点?

时间:2015-05-19 11:07:23

标签: java oop builder

我想知道,与我在大多数网站上看到的构建器对象实现相比,我的构建器对象的实现是否有缺点。我知道为一个只有2个字段的类实现构建器对象有点过分,但这些仅仅是示例,并且意味着很小。

我的实施:

public class User {

    private String firstname;

    private String lastname;

    public String getFirstname() {
        return firstname;
    }

    public String getLastname() {
        return lastname;
    }

    private User(){}

    public static class Builder{

        private final User user;

        public Builder(){
            user = new User();
        }

        public Builder firstname(String firstname){
            user.firstname = firstname;
            return this;
        }

        public Builder lastname(String lastname){
            user.lastname = lastname;
            return this;
        }

        public User build(){
            return user;
        }   
    }
}

互联网上的构建器对象(example1 example2):

public class User {

    private String firstname;

    private String lastname;

    public String getFirstname() {
        return firstname;
    }

    public String getLastname() {
        return lastname;
    }

    private User(Builder builder){
        this.firstname = builder.firstname;
        this.lastname = builder.lastname;
    }

    public static class Builder{

        private String firstname;

        private String lastname;

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

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

        public User build(){
            return new User(this);
        }   
    }
}

第二个实现看起来很麻烦,因为构建器需要与它将构建的对象具有完全相同的字段(读取:编写相同的代码两次)。 对我而言,构建器创建新的User并填充其字段,而不是使用它自己的实例调用User的构造函数,这似乎更自然(对我而言)。

这两个例子都可以通过以下方式进行测试:

public static void main(String[] args) {
        User u = new User.Builder().firstname("Tom").lastname("Jonckheere").Build();
        System.out.println(u.getFirstname());
        System.out.println(u.getLastname());
    }

所以我的问题是: 我实现构建器对象有什么缺点?我无法告诉任何人(我也没有说没有)所以我想听一些反馈意见!或者我的代码也是构建器对象的有效实现吗?

1 个答案:

答案 0 :(得分:6)

实现的不同之处在于,如果要创建多个相同(或相似)但不相同的对象,则必须创建新的Builder,而使用其他实现,您可以执行此操作:< / p>

Builder b = new User.Builder();
User john = b.firstName("John").lastName("Smith").build();
User jack = b.firstName("Jack").build();