如何在java中实现构建器模式的继承

时间:2016-03-27 12:35:47

标签: java inheritance builder

Next代码段显示了如何在Java中实现基本构建器模式。

public class User {
private final String firstName; // required
private final String lastName; // required
private final int age; // optional
private final String phone; // optional
private final String address; // optional

private User(UserBuilder builder) {
    this.firstName = builder.firstName;
    this.lastName = builder.lastName;
    this.age = builder.age;
    this.phone = builder.phone;
    this.address = builder.address;
}

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 static class UserBuilder {
    private final String firstName;
    private final String lastName;
    private int age;
    private String phone;
    private String address;

    public UserBuilder(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public UserBuilder age(int age) {
        this.age = age;
        return this;
    }

    public UserBuilder phone(String phone) {
        this.phone = phone;
        return this;
    }

    public UserBuilder address(String address) {
        this.address = address;
        return this;
    }

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

}
问:如果我有一个以上的User类模型,具有相同的超类(如抽象/非抽象SuperUser作为超类,以及UserA,UserB,UserC扩展它), 如何使用比为每个类添加特定构建器更少的代码来实现构建器,我想为所有子类创建一个构建器

Thnaks

1 个答案:

答案 0 :(得分:1)

有两种可能性浮现在脑海中:

  1. 为每个派生类创建派生构建器类,并为所有方法添加重载,将派生构建器类作为返回值返回,否则只调用超类的方法。由于继承方法返回类型的协方差,这在Java中有效。但这也是你似乎不喜欢的解决方案。

    • 或 -
  2. 生成构建器类:添加表示具体构建器产品类的类型参数,然后向每个派生产品类添加静态构建器构造方法,以返回构建器类的正确参数化实例。这样,您只为了返回类型而保存了构建器方法的重载,并且只有在您真正需要它们来初始化派生产品类的属性时才可以添加构建器类的子类。

    < / LI>