java - builder 模式的抽象类

标签 java design-patterns abstract-class

我现有的模型类总是使用这样的构建器模式:

public class Model {
    public static class Builder {
        private boolean isValid;
        private List<String> errorMessagesOrNull;

        public Builder setIsValid(final boolean isValid) {
            this.isValid = isValid;
            return this;
        }

        public Builder setErrorMessages(final List<String> errorMessages) {
            this.errorMessagesOrNull = errorMessages;
            return this;
        }

        public List<String> getErrorMessages() {
            return this.errorMessagesOrNull == null ? new ArrayList<>() : this.errorMessagesOrNull;
        }

        public Model Build() {
            return new Model(this);
        }
    }

    private boolean isValid;
    private List<String> errorMessages;

    private Model(final Builder builder) {
        this.isValid = builder.isValid;
        this.errorMessages = builder.getErrorMessages();
    }

    public boolean getIsValid() {
        return isValid;
    }

    public List<String> getErrorMessages() {
        return errorMessages;
    }
}

如您所见,模型类始终具有 isValiderrorMessages。我想写一个抽象类来最小化那些模型类的重复逻辑。

所以我想出了这个抽象类:

public abstract class AbstractModel<T extends AbstractModel<T>> {

    public static abstract class Builder<T> {
        private boolean isValid;
        private List<String> errorMessagesOrNull;

        public Builder<T> setIsValid(final boolean isValid) {
            this.isValid = isValid;
            return this;
        }

        public Builder<T> setErrorMessages(final List<String> errorMessages) {
            this.errorMessagesOrNull = errorMessages;
            return this;
        }

        public List<String> getErrorMessages() {
            return this.errorMessagesOrNull == null ? new ArrayList<>() : this.errorMessagesOrNull;
        }

        public abstract T Build();
    }

    private boolean isValid;
    private List<String> errorMessages;

    private AbstractModel(final Builder<T> builder) {
        this.isValid = builder.isValid;
        this.errorMessages = builder.getErrorMessages();
    }

    public boolean getIsValid() {
        return isValid;
    }

    public List<String> getErrorMessages() {
        return errorMessages;
    }
}

但它并没有真正按照我的预期工作。当我扩展抽象类时:

public class Model extends AbstractModel<Model> {
    // Empty here since all fields are extended
}

我不能做这样的事情:

Model model = new Model.Builder.setIsValid(true).Build();

我希望抽象类有Builder静态类,这样就不用每次都写静态类Builder

请指教。

最佳答案

您还需要实现Builder

public class Model extends AbstractModel<Model>{


    private Model(final Builder builder) {
        super(builder);
    }

    public static class Builder2 extends AbstractModel.Builder<Model> {

        @Override
        public Model Build() {
            return new Model(this);
        }
    }
}

然后就可以调用了

Model model = new Model.Builder2().Build();

编辑

此外,AbstractBuilder 的构造函数也必须受到保护

  protected AbstractModel(final Builder<? extends Builder<T>> builder) {
        this.isValid = builder.isValid;
        this.errorMessages = builder.getErrorMessages();
    }

关于java - builder 模式的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310891/

相关文章:

java - 如何使用 JSP 中 PropertyPlaceholderConfigurer 中指定的属性文件中的属性

javascript - 使用模块模式时如何创建对象的新实例?

c# - 为什么 C# 不提供 C++ 风格的 'friend' 关键字?

c++ - 制作一个值类型是 C++ 中的抽象类的映射

java - 抽象类需要访问子类属性

javascript - 客户应该如何与服务交互?

java - 如何替换Java字符串中两个连续的引号 ""?

java - 插入具有唯一属性的记录的正确方法

java - 搜索历史和过滤器的面向对象设计

java - 对于具有相同行为但类常量不同的两个类,推荐的模式是什么?