java - 更简洁的 Builder 模式?

标签 java builder

当我回顾 Josh 的 Bloch 书中的 Builder 模式 时,我想出了一个更简单的实现,但我不确定它是否合适。 例如:

public class Test {
    public static void main(String[] args) {
        Numbers first = new Numbers.Builder().setD(3.14).build();
        System.out.println(first);
        Numbers second = new Numbers.Builder().setI(17).setF(1.24F).build();
        System.out.println(second);
        System.out.println(first);
    }
}

final class Numbers {
    private int i;
    private long l;
    private float f;
    private double d;

    private Numbers() {}


    public static class Builder {
        private final Numbers instance = new Numbers();

        public Builder setI(int i) {
            instance.i = i;
            return this;
        }

        public Builder setL(long l) {
            instance.l = l;
            return this;
        }

        public Builder setF(float f) {
            instance.f = f;
            return this;
        }

        public Builder setD(double d) {
            instance.d = d;
            return this;
        }

        public Numbers build() {
            return instance;
        }
    }

    @Override
    public String toString() {
        return String.format("%4d %4d %7.3f %7.3f", i, l, f, d);
    }
}

它仍然可以被视为构建器模式还是我错过了什么?

编辑

这个呢?

//...

private Numbers() {}


private Numbers(Numbers o) {
        i = o.i;
        l = o.l;
        f = o.f;
        d = o.d;
    }

public static class Builder {
        private final Numbers instance = new Numbers();

          //...

        public Numbers build() {
            return new Numbers(instance);
        }
    }

最佳答案

您的代码的问题是,如果您为同一个 Builder 实例调用 build 两次,您将获得相同的 Numbers 实例.如果在调用 build 并获得 Numbers 实例后调用 Builder 的方法,您将更改该实例。构建器创建的实例在构建后应该独立于构建器。

关于java - 更简洁的 Builder 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332109/

相关文章:

java - 将用户提供的 javascript 代码从网页表单存储到数据库时的安全性

Java 泛型 + 构建器模式

android - 用 list<> 填充 builder.setItem

java - 如何在 Java 中实现具有继承性的 Fluent Builder

jpa-2.0 - JPA2 Criteria Builder - 抽象类和多个子类的查询

java - 为什么会出现Permgen OutOfMemoryError?

java - 不同机器上的字符编码

java - 执行 LEFT_RIGHT 滑动菜单时的奇怪行为

基于配置的 C++ 构建器模式

java - 如何使用此 makefile 以及 src/和 bin/中的文件正确生成 java jar 文件