1

将特定于某些实现的对象作为工厂类中的成员变量是一种好习惯吗?例如,在下面的代码中,分别需要 s1 和 s2 来构造 OneChannel 和 secondChannel 对象。将这些声明为工厂内的成员变量是一种好习惯吗?如果没有,还有什么可以替代的。

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 回答