2016-05-04 23 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」在當前實現

相關問題