Java中嵌套生成器模式类
我正在尝试为一个折线图创建一个java类(使用构建器模式),该折线图包含许多属性。基于这些属性的应用程序,我尝试创建内部生成器类(如X轴属性、Y轴属性等)。我是Java新手,我想知道在我的示例中是否可以像下面这样调用构建器对象。我跟踪了一个链接。这将以增量构建对象。我喜欢这个主意。然而,我不知道如何将其用于我的场景 调用方法:Java中嵌套生成器模式类,java,Java,我正在尝试为一个折线图创建一个java类(使用构建器模式),该折线图包含许多属性。基于这些属性的应用程序,我尝试创建内部生成器类(如X轴属性、Y轴属性等)。我是Java新手,我想知道在我的示例中是否可以像下面这样调用构建器对象。我跟踪了一个链接。这将以增量构建对象。我喜欢这个主意。然而,我不知道如何将其用于我的场景 调用方法: new LineGraph().UiPropBuilder(ctx) .setBackgroundColor(Color.BLUE)
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);}
}
可以这样做的一种方法是,有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(); }
}
}
一个更复杂的示例是编写类似于步骤生成器工作方式的内容。我们为每个“步骤”定义接口,并在单个类中实现它们。“切换”属性的每个方法实际上都返回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();
}
在您的问题“只调用一次.build()语句来创建所有对象”。您是否打算只编写一次“to call.build()语句来创建具有所有属性集的”