如何在spring

时间:2017-07-24 21:39:39

标签: java spring design-patterns

我有一个问题,我正在努力解决。我需要能够根据用户的输入返回实现。我已经研究过使用抽象工厂模式,但我不确定它是否是最佳方式(或者如果Spring可以帮助我一点点)。

以下是工厂将返回的界面:

public interface Flow {
    List<Message> execute(String sessionKey);
}

和该接口的1个实现:

@Component("AssignSeatFlow")
public class AssignSeatFlow implements ChatbotFlow {

    private SeatService seatService;

    @Autowired
    public AssignSeatFlow(final SeatService seatService) {
        this.seatService = seatService;
    }

    @Override
    public List<Message> execute(String sessionKey) {
        // Implementation here
    }
}

我当前的工厂界面:

public interface FlowFactory {

    Flow getFlow(final String intentCode);

}

及其实施:

@Component
public class FlowFactoryImpl implements FlowFactory {

    @Resource("AssignSeatFlow")
    private Flow assignSeatFlow;

    @Override
    public Flow getFlow(final String intentCode) {
        if(StringUtils.isNullOrEmpty(intentCode)) {
            throw new IllegalArgumentException("Intent Code cannot be empty");
        }

        switch (intentCode.toUpperCase()) {
            case "AssignSeatFlow":
                return assignSeatFlow;
            default:
                throw new IllegalArgumentException("Unable to determine flow");
        }
    }
}

这看起来并不理想的原因是,当我添加更多Flow时,工厂会变得更大,每次我都要修改它。我也不是现场自动装配的粉丝,因为它使测试更复杂,更不明确。

感谢您的反馈。

1 个答案:

答案 0 :(得分:2)

我会将spring上下文注入我的工厂并直接从那里获取bean:

@Autowired 
private ApplicationContext ctx;
.
.
.
public Flow getFlow(final String intentCode) {
    return ctx.getBean(intentCode);
}

我省略了错误处理,但这是基本的想法。通过这种方式,您可以在添加更多流类型时随时触摸工厂。

访问应用程序上下文并不是一种很好的通用做法,因为它鼓励人们使用spring作为服务定位器。但它对工厂非常有效。