【问题标题】:Complex builder pattern scenario - java复杂的构建器模式场景 - java
【发布时间】:2014-07-06 01:43:11
【问题描述】:

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

【问题讨论】:

  • 我想我理解你的问题,但我不知道你发布的代码与构建器和调用构建器函数的顺序有什么关系。
  • 感谢您的回复。我需要创建 6 个对象并且有 40 多行代码来执行此操作。所以我试图看看是否有一种更简洁的方法来构建对象,而不是在构造函数/单个过程中编写这 40 行。
  • 您可以使用高度复杂的构建器设计强制执行顺序,例如包含返回 NotYetReaderBuilder 的函数。只有最终函数返回实际的Builder 对象。另一种方法是让普通构建器(例如Bloch Builder)中的函数接受多个参数。因此,如果第三步需要第二步的值,则将构建器函数设为itemsTwoAndThree(o2, o3)。不依赖他人的函数可以只是普通的独立函数(name("Humphrey"))。

标签: java builder


【解决方案1】:

构建器模式不一定是您所需要的,因为它无法强制执行“顺序”。

例如:

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。

【讨论】:

    【解决方案2】:

    您有相互依赖的不同对象,因此在创建它们时需要遵循顺序。我认为构建器模式不适合这里,你需要的是依赖注入,所以你不需要考虑所有的依赖和顺序,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) {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多