2016-05-04 74 views
0

我仍然遵循以下实施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")); 


    } 
} 
+0

,如何保护构造函数被调用?从您发布的代码中,构建器不是内联类 – Kritner

+0

此外,您尚未在构建器中定义'getX()'和'getY()'。我假设他们不是自动生成的,但假设是基于我的c#知识,java不是我的正常语言 – Kritner

+0

受保护的构造函数用于构建器构建方法,如更新后的代码所示。 – Robert

回答

2

的构造是为了限制保护的范围之外创建的myClass新实例的possibilty protected

这是因为通常一个建设者采用private构造函数来完全避免由客户端代码创建实例,而不使用生成器看起来有点怪。

如果你真的想隐藏类的构造函数来构建,您可以创建Builder作为一个内部类的类的构建:

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(); 
0

与我见过的builder实现不同(不是说它不会工作,但它)。受保护的构造函数也让我困惑。除非你创建了另外一个扩展了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(); 

返回新myClassx = “x” 和y = “Y”

new myBuilder().build(); 

回报新myClassx =“默认X”和y =“默认Y”在当前实现

相关问题