2017-08-14 6 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の各特定のインスタンスが正しくを実行するためにいくつかの追加パラメータを受け入れる必要があることですメソッドを適用してください。たとえば、私は、rafTableRowModifierplanSpecificBenefitsRatingTableRowModifier引用IDにアルゴリズムIDパラメータを渡す必要があります。これらの引数をRowBeanオブジェクトに追加することはできません。追加できる唯一の場所はgetRowModifierInstanceメソッドです。それが大丈夫かどうか教えてください。私にとっては、修飾子の数がになると、メソッドのパラメータの数が増えることがありますが、これは私の意見では悪いと思われます...どうすればそれを避けることができますか?事前に

おかげで、

+0

モディファイアに特定のRatingTypeに適用するかどうかを問い合わせることはできますか?次に、ループ内の使用可能な修飾子を使用してイテレータを実行し、修飾子に応じて作成すると、現在のRatingTypeに適用可能です。 – daniu

+0

主な問題は、 'planSpecificBenefitsRatingTableRowModifier'を呼び出す前に、いくつかの引用符を使って' initialization'を作成する必要があり、この初期化をどこに置くのが良いか分かりません。 – asdasdsdf

+0

私が意味することは、 'Function result = new EmptyMod(); (Modifier mod:modifierList){if mod.isApplicableTo(ratingType){result = result.andThen(mod); for(RatingType ratingType:RatingType.values()) }}}; return result; ' – daniu

答えて

0

は、私はあなたの特定の状況を知らないが、私は上層にあなたが評価タイプに合格する方法と、どのパラメータを知っていることを推測します。私はあなたがこの工場出荷時のパターンを呼び出す方法を知っているが、このような状況ではないと述べたよう

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(); 
    } 
} 

:あなたはnullを渡す避けるために、このアプローチに滞在したい場合は、Map<enum, Object>になります二番目のパラメータを追加することができますジェネリックパラメータを渡すことができます。

+0

お返事ありがとうございます。最後に、私はここでは工場を使わないことに決め、それぞれのオブジェクトを必要な場所で別々に初期化しました。 – asdasdsdf

関連する問題