构建器模式,但构建器

时间:2016-05-04 12:57:58

标签: java builder builder-pattern

我是否仍然遵循以下实施的Builder模式? 令我困惑的是班级中受保护的构造函数" myClass"。我首先想到的是构建器模式是隐藏构建器应该构造的对象。但是我们不在这里。我无法理解这只是糟糕的设计还是设计不错。

public class MyClass{
    private final String x;
    private final String y;

    protected MyClass(MyBuilder builder){
            this.x = builder.getX();
            this.y = builder.getY();
    }

   //getters...
}

public class MyBuilder{
    private String X;
    private String Y;

    public MyBuilder withX(String x){
        this.x = x;
        return this;
    }

    public MyBuilder withY(String y){
        this.y = y;
        return this;
    }

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

    //getters....
}

public class Main{
    public static void main(){
        //Example 1
        MyClass myClass = new MyBuilder().withX("x").withY("y").build();

        //Example 2
        MyClass myClass2 = new MyClass(new MyBuilder().withX("x").withY("y"));


    }
}

2 个答案:

答案 0 :(得分:3)

构造函数为protected,以限制在受保护范围之外创建myClass的新实例的可能性。

这看起来有点奇怪,因为通常构建器使用private构造函数来完全避免客户端代码创建实例而不使用构建器。

如果你真的想要隐藏要构建的类的构造函数,可以将构建器创建为要构建的类的内部类:

public static class MyClass{
    private final String x;
    private final String y;

    private MyClass(MyBuilder builder){
            this.x = builder.x;
            this.y = builder.y;
    }

    public static class MyBuilder{
        private String x;
        private String y;

        public MyBuilder(){
        }

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

        public MyBuilder withX(String x){
            this.x = x;
            return this;
        }

        public MyBuilder withY(String y){
            this.y = y;
            return this;
        }

    }
}

在这种情况下,创建新实例的唯一方法是使用构建器,因为MyClass的构造函数现在是私有

MyClass myClass = new MyBuilder().withX("xXx").withY("yYy").build();

答案 1 :(得分:0)

与我见过的构建器实现不同(不是说它不会起作用)。受保护的构造函数也让我感到困惑。除非你创建了另一个扩展myClass的类,否则如何调用它?此时,您的构建器可能对扩展类的功能有所不同。

我过去常常使用流利的构建器来返回它所构建的对象的实例,但这可能仅仅是我的偏好。

要构建的类:

public class myClass{
    private final String x;
    private final String y;

    public myClass(String x, String y){
            this.x = x;
            this.y = y;
    }

}

生成器:

public class myBuilder{
    private String X = "Default X";
    private String Y = "Default Y";

    public myBuilder withX(String x){
        this.x = x;
        return this;
    }

    public myBuilder withY(String y){
        this.y = y;
        return this;
    }

    public myClass build(){
        return new myClass(y, x);
    }
}

通话:

new myBuilder().withX("x").withY("y").build(); 

使用myClass =" x"返回新的xy =" y"

new myBuilder().build();

返回新的myClass x ="默认X"和y ="默认Y"