java中的工厂方法模式

时间:2013-08-24 16:34:19

标签: java spring singleton

在工厂类中将特定于某些实现的对象作为成员变量是一种好习惯吗?   例如,在下面的代码中,分别构造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 ad s2是单身豆

2 个答案:

答案 0 :(得分:1)

由于您需要这些bean来构建这些特定的通道实现,我认为您可以将它们作为特定工厂实现中的属性。您正在注入所需的组件,因此您可以根据需要灵活地更改实现。

此外,如果SomeClassSomeOtherClass是一些抽象/接口/超类型,那将会更好。通过这种方式,如果您将来需要提供不同的实现来构建这些通道对象,您将能够非常轻松地完成这些操作。

答案 1 :(得分:0)

为什么不让Spring使用BeanFactoryAware创建OneChannel()和SecondChannel()对象?

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" />