我想實現一個生成器模式與靜態內部類可以說與域的類A(A1,A2,A3),B與場(B1,B2)和C字段(C1),而所有股票領域(S1,S2)從超類父類:的Java Builder模式與繼承
public class A extends SuperClass {
private final String a1;
...
private A(ABuilder builder) {
super(builder);
this.a1 = builder.a1;
...
}
public static class ABuilder extends SuperClassBuilder implements ABuilderInterface {
private String a1;
...
@Override
public ABuilder withA1(String a1) {
this.a1 = a1;
return this;
}
...
@Override
public SuperClass build() {
return new A(this);
}
}
}
因此對B和C的建設者只是不同,他們有自己的領域和實現自己的接口(BBuilderInterface和CBuilderInterface),而這些接口僅限定要實施哪些方法:
public interface ABuilderInterface extends SuperClassBuilderInterface {
ABuilderInterface withA1(String a1);
...
}
...<interfaces for B and C>
public interface SuperClassBuilderInterface {
SuperClassBuilderInterface withS1(String s1);
...
SuperClass build();
}
// Usage of the builders:
public SuperClass foo() {
return new A.ABuilder()
.withA1(...) // returns ABuilderInterface
...
.withS1(...) // returns SuperClassBuilderInterface
...
.build();
}
public abstract class SuperClass {
private final String s1;
...
protected SuperClass(SuperClassBuilder builder) {
this.s1 = builder.s1;
...
}
protected static abstract class SuperClassBuilder implements SuperClassBuilderInterface {
private String s1;
...
@Override
public SuperClassBuilder withS1(String s1) {
this.s1 = s1;
return this;
}
...
@Override
public abstract SuperClass build();
}
}
現在你可以發現當我使用構建器的時候,我必須首先注意與子類相關的方法,然後鏈接超類的方法,這不是什麼大問題,但仍不確定是否良好的做法。 另一方面,我可以將兒童類的...方法一起添加到超類接口中,然後限制消失,但是接下來我有一個與不同子類的方法混合的接口。
哪一個你更喜歡/建議?
是什麼在''ABuilder' withS1()'回報? – alayor
ABuilder @alayor中沒有withS1(),因爲它使用的是父類。這個想法是,A,B,C構建器只包含它們特定的...方法,而共享的構件保留在超級構建器中。 – radio
這是一個非常常見的問題。一種模式是在超類上定義一個通用的「自我類型」,並通過其方法返回。 – shmosel