1

ある実装に固有のオブジェクトをファクトリ クラスのメンバ変数として持つことは良い習慣ですか? たとえば、以下のコードでは、OneChannel オブジェクトと secondChannel オブジェクトをそれぞれ構築するために s1 と s2 が必要です。これらをファクトリ内のメンバー変数として宣言するのは良い習慣ですか? そうでない場合、他の選択肢は何ですか。

public class CommunicationChannelFactoryImpl {
@Autowired 
SomeClass s1;
@Autowired
SomeOtherClass s2;

 public CommunicationChannel getCommunicationChannel(String channel, Map<String, String> channelProperties) {

  if(channel.equals("ONE")   {
    return new OneChannel(s1);
  }

  if(channel.equals("TWO") {
   return new SecondChannel(s2);
  }
 }
}

s1 と s2 はシングルトン Bean であることに注意してください

4

2 に答える 2

1

これらの特定のチャネル実装を構築するためにこれらの Bean が必要なので、その特定のファクトリ実装でそれらをプロパティとして保持できると思います。必要なコンポーネントを注入しているため、必要に応じて後で実装を柔軟に変更できます。

SomeClassまた、SomeOtherClassいくつかの抽象化/インターフェース/スーパータイプであるとより良いでしょう。このようにして、将来これらのチャネル オブジェクトを構築するためにさまざまな実装を提供する必要が生じた場合でも、非常に簡単に実現できます。

于 2013-08-24T16:55:44.523 に答える
0

Spring が を使用して OneChannel() および SecondChannel() オブジェクトを作成できないのはなぜBeanFactoryAwareですか?

public class CommunicationChannelFactoryImpl implements BeanFactoryAware {
  FactoryBean factoryBean;

  public void setBeanFactory(FactoryBean factoryBean) {
    this.factoryBean = factoryBean;
  }
  public CommunicationChannel getCommunicationChannel(String channel, Map<String, String> channelProperties) {

    if(channel.equals("ONE")   {
      return this.factoryBean.getBean("oneChannel");
    }

    if(channel.equals("TWO") {
      return this.factoryBean.getBean("secondChannel");
    }
  }
}

XML(またはJavaConfig、ただし私は使用していません)を次のように定義します。

<bean id="oneChannel" scope="prototype">
  <constructor-arg index="0" ref="s1" />
</bean>
<bean id="secondChannel" scope="prototype">
  <constructor-arg index="0" ref="s2" />
</bean>
<bean id="s1" class="path.to.SomeClass" />
<bean id="s2" class="path.to.SomeOtherClass" />
于 2013-08-24T17:02:02.327 に答える