2016-04-19 2 views
1

多くのプロパティを囲む折れ線グラフ(ビルダーパターンを使用)のJavaクラスを作成しようとしています。これらのプロパティのアプリケーションに基づいて、内部ビルダークラス(X軸プロパティ、Y軸プロパティなど)を作成しようとしています。私はJavaに慣れていないので、私の例では以下のようなBuilderオブジェクトを呼び出すことができるかどうかを知りたいと思っています。私はリンクCan the builder pattern ever be doing too much?に続いた。インクリメントでオブジェクトを構築します。私はそのアイディアが好きだった。しかし、私は自分のシナリオでどのように使うことができるのか分かりません。Javaでビルダーパターンクラスをネストする

Invokeメソッド:

new LineGraph().UiPropBuilder(ctx) 
       .setBackgroundColor(Color.BLUE) 
       .build() 
       .XAxisProperties() 
       .enableGridLines(true) 
       .build() 
       .YAxisProperties() 
       .enableGridLines(false) 
       .build(); 

は、それは一度だけ)(ステートメントを.build呼び出す代わりに、それを複数回繰り返して、すべてのオブジェクトを作成することは可能ですか?

クラス:あなたはそれを行うことができ

public class LineGraph{ 

    private LineGraph() 

    public static class UiPropBuilder{ 

     private Integer mBackgroundColor; 
     private Boolean bTouchEnabled; 
     ... 

     public UiPropBuilder (Context ctx) { this.ctx = ctx; } 

     public UiPropBuilder setBackgroundColor(Integer mBackgroundColor){ this.mBackgroundColor = mBackgroundColor; return this;} 

     public UiPropBuilder touchEnabled(Boolean bTouchEnabled){ this.bTouchEnabled = bTouchEnabled; return this;} 

     ... some more properties... 
     public UiPropBuilder build(){ return new UiPropBuilder(this); }  

    } 

// X-Axis properties builder 
public static class XAxisProperties{ 
    // variable declarations and constructor omitted 
    public XAxisProperties enableGridLines(Boolean enable) {this.enable = enable); return this;} 
    public XAxisProperties build(){ return new XAxisProperties(this);} 


// Y-Axis properties Builder 

public static class YAxisProperties{ 
    // variable declarations and constructor omitted 
    public YAxisProperties enableGridLines(Boolean enable) {this.enable = enable); return this;} 
    public YAxisProperties build(){ return new YAxisProperties(this);} 
} 
+0

あなたの質問では、 "ビルド(ビルド)文はすべてのオブジェクトを作成するために1回だけです。"あなたは "ビルドするすべてのプロパティを作成するために.build()ステートメントを1回だけ呼び出す"という記述をしていましたか? – alphablue

答えて

1

一つの方法は、あなたがすべては互いを参照し、それらを切り替えることができます3つのビルダーオブジェクトを持っているところ、この、のようになります。それはあなたがすでにやってしようとしていたものに似ています:

public static class UiPropBuilder { 
    private XAxisProperties xAxisProperties = new XAxisProperties(); 
    private YAxisProperties yAxisProperties = new YAxisProperties(); 
    // ... 
    public XAxisProperties xAxisProperties() { return xAxisProperties; } 
    public YAxisProperties yAxisProperties() { return yAxisProperties; } 

    public LineGraph build() { 
     return new LineGraph(..., ..., ..., ...); 
    } 

    public class XAxisProperties { 
     // ... 
     public YAxisProperties yAxisProperties() { yAxisProperties; } 
     public UiPropBuilder uiProperties() { return UiPropBuilder.this; } 
     public LineGraph build() { return UiPropBuilder.this.build(); } 
    } 

    public class YAxisProperties { 
     // ... 
     public XAxisProperties xAxisProperties() { return xAxisProperties; } 
     public UiPropBuilder uiProperties() { return UiPropBuilder.this; } 
     public LineGraph build() { return UiPropBuilder.this.build(); } 
    } 
} 

より複雑な例では、ステップビルダーが機能する方法に類似した何かを書くことです。私たちはそれぞれの「ステップ」のためのインターフェースを定義し、それらをすべて1つのクラスに実装します。プロパティを「切り替える」メソッドはそれぞれ、実際にはthisを返します。

public interface BuildStep  { LineGraph  build();   } 
public interface UiSwitchStep { UiPropBuilder uiProperties(); } 
public interface XAxisSwitchStep { XAxisPropBuilder xAxisProperties(); } 
public interface YAxisSwitchStep { YAxisPropBuilder yAxisProperties(); } 

public interface UiPropBuilder 
extends XAxisSwitchStep, YAxisSwitchStep, BuildStep { 
    // UI property setters 
    // ... 
} 

public interface XAxisPropBuilder 
extends YAxisSwitchStep, UiSwitchStep, BuildStep { 
    // X-axis property setters 
    // ... 
} 

public interface YAxisPropBuilder 
extends XAxisSwitchStep, UiSwitchStep, BuildStep { 
    // Y-axis property setters 
    // ... 
} 

private static class UiBuilderImpl 
implements UiPropBuilder, XAxisPropBuilder, YAxisPropBuilder { 
    // implement ALL property setters 
    // ... 

    @Override 
    public XAxisProperties xAxisProperties() { 
     return this; 
    } 
    @Override 
    public YAxisProperties yAxisProperties() { 
     return this; 
    } 
    @Override 
    public UiPropBuilder uiProperties() { 
     return this; 
    } 
    @Override 
    public LineGraph build() { 
     return new LineGraph(..., ..., ..., ...); 
    } 
} 

// create new builders through a static method 
// which returns the interface type 
public static UiPropBuilder builder() { 
    return new UiBuilderImpl(); 
} 
関連する問題