次のコードがあります。
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に傾いていますが、どちらを選ぶべきですか?または、私が考えていない他のより良いアプローチはありますか?