传递部分完整的构建器实例

时间:2019-01-07 20:49:59

标签: design-patterns builder

是否可以将构建器实例从一个对象传递到另一个对象以添加不同的字段值?

在下面的示例中,应从多个位置(DateAdder和PlaceAdder)获得创建VacationPlan实例的详细信息。组织者将创建构建器实例,并将其作为参数传递给这些“ appender”实例,并最终执行build()调用。

示例:

public class Organizer {

        private final DateAdder dateAdder;
        private final PlaceAdder placeAdder;
        private final VacationProviderSearch vacationProviderSearch;

        public void organizeVacation() {
            VacationPlan.Builder vacationPlanBuilder = VacationPlan.newBuilder();
            vacationPlanBuilder = dateAdder.addDate(vacationPlanBuilder);
            vacationPlanBuilder = placeAdder.addPlace(vacationPlanBuilder);
            VacationPlan vacationPlan = vacationPlanBuilder.build();
            List<Provider> providers = vacationProviderSearch.getProviders(vacationPlan);
            // use providers to get the best vacation provider
        }

    }

我们正在讨论这种方法的工作原理,我认为对于那些单独的附加程序,最好接受非生成器实例作为参数,并将它们各自的输出作为POJO返回。

如下所示:

public void organizeVacation() {
    VacationDateRange dateRange = dateProvider.getDateRange(userRequestJson);
    String location = locationProvider.getLocation(userRequestJson);
    VacationPlan vacationPlan = vacationPlanBuilder.newBuilder()
            .startDate(dateRange.getStartDate())
            .endDate(dateRange.getEndDate())
            .location(location)
            .build();
    List<Provider> providers = vacationProviderSearch.getProviders(vacationPlan);
    // use providers to get the best vacation provider
}

这可确保系统周围没有任何可变实例。这些方法中哪种更好?

2 个答案:

答案 0 :(得分:1)

第二种方法更清洁,因为它消除了日期/位置提供程序与构建器或VacationPlan类型之间不必要的耦合。这也使对提供者进行单元测试变得更加容易(第一种方法中的测试将要求在构建器上暴露getter或模拟构建器,但这两种方法都不可取。

答案 1 :(得分:0)

我建议您首先添加一个Adder接口,该接口将由DateAdderPlaceAdder实现。此Adder界面可以有一个名为getData()的方法。

通过将其传递给构造函数或其他方式在管理器中创建Adder对象的列表。

VacationPlan.Builder中创建一个名为withAdder()的方法,该方法将加法器作为参数并读取其数据以更新构建器对象。

organizeVacation()方法内部,遍历Adder列表,并通过将Adder传递给此方法来调用withAdder()的{​​{1}}方法。在VacationPlan.Builder方法内,您可以调用withAdder()接口的方法来获取Adder特定的数据。

如果您需要进一步澄清或如果我没有任何意义,请告诉我。