1

次のコードがあります。

public IFoo getFoo(Type type) // Type is an enum containing A, B etc.
{
    switch(type)
    {
        case A: return new Foo1(); // implements IFoo
        case B: return new Foo2(); // implements IFoo
        etc.
    } 
}

これは明らかに OCP に違反しているため、リファクタリングする必要があります。さらに、Spring コンテナーによって管理されるプロトタイプ Bean を返す必要があります。これを達成するために、次のオプションを考えることができます。

1) このクラスを AppContextAware にします。String が Bean ID である Map<Type, String> を作成します。これらの Bean を Spring Config でプロトタイプとして定義し、このマップも Spring 構成で定義して、このクラスに注入します。次に、このマップから特定の列挙型の Bean ID を取得し、それを使用して AppContext から Bean を取得します。

2) 同様のアプローチですが、Map の値については、呼び出す抽象メソッドを持つ TargetSource を使用し、TargetSource 定義ごとにこの抽象メソッドとしてgetTarget()定義されたプロトタイプ Bean を配線します。lookup-method

3) 同様のアプローチですが、TargetSource の代わりに FactoryBean を使用します。

#1 では、私のクラスは AppContext に依存していますが、他のアプローチではそうではありません。だから私は#2または#3に傾いていますが、どちらを選ぶべきですか?または、私が考えていない他のより良いアプローチはありますか?

4

2 に答える 2

1

とにかく、#1 を使用することになりました。これが最も単純であり、作成する Bean の数が少ないからです。

于 2012-11-06T14:14:37.250 に答える
0

The FactoryBeanを見てください。探しているものかもしれません。例については、こちらをご覧ください。

h番目

于 2012-10-30T10:38:14.653 に答える