我有一个班级“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);
}
}
答案 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) {
}
}