【问题标题】:How to implement Inheritance of builder pattern in java如何在java中实现构建器模式的继承
【发布时间】:2016-03-29 00:25:05
【问题描述】:

下一个 sn-p 展示了如何在 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 扩展了它), 我如何用更少的代码来实现构建器而不是为每个类添加特定的构建器,我喜欢为所有子类创建一个构建器

感谢

【问题讨论】:

  • 我建议基于主构建器为每个子类编写一个内部类,然后创建静态方法来访问内部构建器
  • 然后在应该改变所有字段访问公共,它不会破坏模式范式?

标签: java inheritance builder


【解决方案1】:

想到两种可能性:

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

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

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多