Java 生成器模式,但对象构造函数中的生成器

Java 生成器模式,但对象构造函数中的生成器,java,builder,builder-pattern,Java,Builder,Builder Pattern,我是否仍在使用下面的实现遵循构建器模式? 让我困惑的是类“myClass”中受保护的构造函数。对于构建器模式,我的第一个想法是隐藏构建器应该构建的对象。但在这里我们没有。我不明白这是坏设计还是好设计 public class MyClass{ private final String x; private final String y; protected MyClass(MyBuilder builder){ this.x = 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"));


    }
}

构造函数受
保护
,以限制在受保护范围之外创建
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
的构造函数现在是private

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

构造函数受
保护
,以限制在受保护范围之外创建
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
的构造函数现在是private

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

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

我习惯于使用fluent构建器返回它正在构建的对象的实例,但这可能只是我的偏好

要构建的类:

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
=“x”和
y
=“y”


返回新的
myClass
,其中
x
=“Default x”和
y
=“Default y”

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

我习惯于使用fluent构建器返回它正在构建的对象的实例,但这可能只是我的偏好

要构建的类:

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
=“x”和
y
=“y”


返回新的
myClass
,其中
x
=“Default x”和
y
=“Default y”

在当前实现中,如何调用受保护的构造函数?根据您发布的代码,生成器不是内联类。此外,您还没有在生成器中定义
getX()
getY()
。我假设它们不是自动生成的,但这个假设是基于我的c#知识,java不是我的普通语言受保护的构造函数在构建器构建方法中使用,如更新的代码所示。在您当前的实现中,如何调用受保护的构造函数?根据您发布的代码,生成器不是内联类。此外,您还没有在生成器中定义
getX()
getY()
。我假设它们不是自动生成的,但这种假设是基于我的c#知识,java不是我的普通语言受保护的构造函数用于构建器构建方法,如更新的代码所示。