2017-08-14 76 views
1

我有下面的情况:有一个工厂,返回功能接口的实例:如何在工厂更好地初始化对象?

public class RatingTableRowModifierFactory 
{ 
    @Autowired 
    private PlanSpecificBenefitsRatingTableRowModifier planSpecificBenefitsRatingTableRowModifier; 
    @Autowired 
    private CompositeBenefitsRatingTableRowModifier compositeBenefitsRatingTableRowModifier; 
    @Autowired 
    private RafRatingTableRowModifier rafTableRowModifier; 

    public Function<RowBean, RowBean> getRowModifierInstance(.... input) 
    { 
    switch (ratingType) 
    { 
     case AGE: 
     return planSpecificBenefitsRatingTableRowModifier; 
     case COMPOSITE_AGE: 
     return planSpecificBenefitsRatingTableRowModifier 
      .andThen(compositeBenefitsRatingTableRowModifier) 
      .andThen(rafTableRowModifier); 
     default: 
     return new EmptyRatingTableRowModifier(); 
    } 
    } 
} 

在我的方法的主要问题是,RowModifier的每一个具体的实例必须接受以正确执行一些额外的参数应用方法。例如,我需要通过算法ID参数为planSpecificBenefitsRatingTableRowModifier报价IDrafTableRowModifier。我无法将这些参数添加到RowBean对象中,并且我可以添加它们的唯一位置是getRowModifierInstance方法。请让我知道,如果没关系?至于我,它看起来不好,因为如果修改器的数量会增长,那么方法参数的数量也可能会增加,这是从我的意见不好...请帮我理解如何避免这种情况?

由于提前,

+0

你可以给修饰语一个查询他们是否适用于特定的RatingType?然后你可以遍历循环中的可用修饰符并根据修饰符进行组合,这适用于当前的RatingType。 – daniu

+0

主要的问题是,在调用'planSpecificBenefitsRatingTableRowModifier'之前,我需要做一些'初始化',例如一些quote id,我不知道放在哪里会更好。 – asdasdsdf

+0

我的意思是'功能 result = new EmptyMod(); for(RatingType ratingType:RatingType.values()){for(Modifier mod:modifierList){if mod.isApplicableTo(ratingType){result = result.andThen(mod); }}};返回结果;' – daniu

回答

0

我不知道你的具体情况,但我想这在上层,你知道你是怎么和参数要传递的评价类型。如果你想留在这种方法中,避免将空,您可以添加,这将是Map<enum, Object>秒参数:

enum ModifiersEnum { 
    COMPOSITE_BENEFITS_TABLE_ROW, 
    TABLE_ROW; 
} 

public Function<RowBean, RowBean> getRowModifierInstance(ModifiersEnum ratingType, Map<ModifiersEnum, Object> parameters) { 
    switch (ratingType) 
    { 
     case AGE: 
     return planSpecificBenefitsRatingTableRowModifier; 
     case COMPOSITE_AGE: 
     return planSpecificBenefitsRatingTableRowModifier 
      .andThen(parameters.get(ModifiersEnum.COMPOSITE_BENEFITS_TABLE_ROW)) 
      .andThen(parameters.get(ModifiersEnum.TABLE_ROW)); 
     default: 
     return new EmptyRatingTableRowModifier(); 
    } 
} 

正如我所说的,我不知道你是如何调用该工厂模式,但在这种情况下,你可以传递通用参数。

+0

感谢您的回复。最后,我决定不在这里使用工厂,并在需要的地方分别初始化每个对象。 – asdasdsdf