我有一个问题,我正在努力解决。我需要能够根据用户的输入返回实现。我已经研究过使用抽象工厂模式,但我不确定它是否是最佳方式(或者如果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时,工厂会变得更大,每次我都要修改它。我也不是现场自动装配的粉丝,因为它使测试更复杂,更不明确。
感谢您的反馈。
答案 0 :(得分:2)
我会将spring上下文注入我的工厂并直接从那里获取bean:
@Autowired
private ApplicationContext ctx;
.
.
.
public Flow getFlow(final String intentCode) {
return ctx.getBean(intentCode);
}
我省略了错误处理,但这是基本的想法。通过这种方式,您可以在添加更多流类型时随时触摸工厂。
访问应用程序上下文并不是一种很好的通用做法,因为它鼓励人们使用spring作为服务定位器。但它对工厂非常有效。