复杂的构建器模式场景 - java

时间:2014-07-05 17:11:37

标签: java builder

我有一个班级“MyClass”。 MyClass的对象创建很复杂,因为它有6个步骤,其中一些依赖于前面的步骤。构建器模式是否适用于此场景?如果是的话,我该怎么做?请指教。

如果问题不明确并且您需要更多输入,请回复。

代码,(我已经将示例代码中的步骤减少到3,实际上我有6个步骤,其中一些依赖于前面的步骤,总共有40行代码。所以我试图看看我是否可以构建以更清洁的方式对象。)

public class MyClass{
private SomeObject3 obj3;
private SomeObject1 obj1;

public MyClass(ParamObject param)
{ 
    obj1 = new SomeObject1(param);
    SomeObject2 obj2 = new SomeObject2(obj1);
    obj3 = new SomeObject3(obj2);
}
}

2 个答案:

答案 0 :(得分:1)

构建器模式不一定是您需要的,因为它无法强制执行" order"。

例如:

builder.setX(x)
       .setY(y)
       .setDepth(p);
builder.build();

应该相当于:

builder.setY(y)
       .setArea(p)
       .setX(x);
builder.build();

那就是说,你可以"隐藏"例如,构建器中的步骤仅执行:

builder.setX(x)
       .setY(y)
builder.build();

并在setX()setY()的实现中检查是否设置了两个参数,如果答案是"是" - 调用私有方法setArea(x*y)。在此示例中,您必须在以下位置添加验证:     builder.build(); 看到x,y和area都已设置,如果没有 - 引发IllegalStateException。

答案 1 :(得分:0)

您有不同的对象相互依赖,因此您需要在创建它们时遵循顺序。我认为构建器模式在这里不合适,你需要的是依赖注入,所以你不需要考虑所有的依赖关系和顺序,IOC容器(或其他东西)会为你处理这个问题。检查:What is dependency injection?

通过这个解决方案,你可以有类似的东西,例如:

public class MyClass {
    @Inject
    private SomeObject3 obj3;
    @Inject
    private SomeObject1 obj1;

    public MyClass() {
        // ...
    }
}

public class SomeObject1 {
    @Inject
    public SomeObject1(ParamObject paramObject) {
    }
}

public class SomeObject2 {
    @Inject
    public SomeObject2(SomeObject1 someObject1) {
        // ...
    }
}

public class SomeObject3 {
    @Inject
    public SomeObject3(SomeObject2 someObject2) {
    }
}