生成器模式和继承
我有一个对象层次结构,随着继承树的加深,复杂性会增加。这些都不是抽象的,因此,它们的所有实例都或多或少地用于复杂的目的。
由于参数的数量非常高,因此我希望使用生成器模式来设置属性,而不是编写多个构造函数。由于我需要满足所有排列,因此继承树中的叶类将具有伸缩构造函数。
当我在设计过程中遇到一些问题时,我在这里浏览了一个答案。首先,让我给你一个简单,肤浅的例子来说明这个问题。
public class Rabbit
{
public String sex;
public String name;
public Rabbit(Builder builder)
{
sex = builder.sex;
name = builder.name;
}
public static class Builder
{
protected String sex;
protected String name;
public Builder() { }
public Builder sex(String sex)
{
this.sex = sex;
return this;
}
public Builder name(String name)
{
this.name = name;
return this;
}
public Rabbit build()
{
return new Rabbit(this);
}
}
}
public class Lop extends Rabbit
{
public float earLength;
public String furColour;
public Lop(LopBuilder builder)
{
super(builder);
this.earLength = builder.earLength;
this.furColour = builder.furColour;
}
public static class LopBuilder extends Rabbit.Builder
{
protected float earLength;
protected String furColour;
public LopBuilder() { }
public Builder earLength(float length)
{
this.earLength = length;
return this;
}
public Builder furColour(String colour)
{
this.furColour = colour;
return this;
}
public Lop build()
{
return new Lop(this);
}
}
}
现在我们有一些代码要继续,成像我想构建一个:Lop
Lop lop = new Lop.LopBuilder().furColour("Gray").name("Rabbit").earLength(4.6f);
此调用不会编译,因为无法解析最后一个链接的调用,无法定义方法。因此,这种方式要求所有调用都以特定顺序链接,这是非常不切实际的,特别是对于深层层次结构树。Builder
earLength
现在,在我搜索答案的过程中,我遇到了一个Java Builder类的子类,它建议使用奇怪的递归泛型模式。但是,由于我的层次结构不包含抽象类,因此此解决方案对我不起作用。但是这种方法依赖于抽象和多态性来发挥作用,这就是为什么我不相信我能适应我的需求。
我目前采用的一种方法是覆盖层次结构中超类的所有方法,只需执行以下操作:Builder
public ConcreteBuilder someOverridenMethod(Object someParameter)
{
super(someParameter);
return this;
}
通过这种方法,我可以确保返回一个可以发出链调用的实例。虽然这并不像伸缩反模式那样糟糕,但它是紧随其后的,我认为它有点“黑客”。
对于我的问题,是否有其他我不知道的解决方案?优选与设计模式一致的解决方案。谢谢!