我希望我的其他类与我的域的接口而不是实现进行交互,我希望避免在代码中硬编码实现,例如:
public void addToMyList(String s, int i) {
DomainModel model = new DefaultDomainModelImpl(); // it's hardcoding the implementation here
model.setName(s).setAge(i);
myList.add(model);
}
如果我使用spring容器,使用 prototype 范围,我可以使用类似的东西:
// <bean id="myDomainBean" scope="prototype" class="my.package.domain.MyDomainImpl" />
DomainModel myDomainModel = springContext.getBean("myDomainBean");
但我想避免在我的代码中显式访问springContext。
我想知道干净的方法是什么?
我目前正在考虑为每个域实现创建一个工厂实现,并自动装配工厂来创建bean,但这意味着我的域的不同实现也会有不同的工厂实现。
请分享您的意见,谢谢!
答案 0 :(得分:2)
我目前正在考虑为每个域实现创建一个工厂实现,并自动装配工厂来创建bean,但这意味着我的域的不同实现也会有不同的工厂实现。
这不是100%正确。您可以拥有一个工厂,该工厂采用需要创建的Domain对象的Interface(类)。您可以在课堂上注入该工厂。 因此,您将获得所要求的所有要求:
new
例如
@Inject
MyStrangeSpringHiddingFactory myStrangeSpringHiddingFactory;
DomainModel myDomainModel = this.myStrangeSpringHiddingFactory.
createInstanceOf(DomainModel.class);
class MyStrangeSpringHiddingFactory implements MyStrangeSpringHiddingFactory {
@Inject
ApplicationContext springContext:
public <T> createInstanceOf(Class<T> clazz) {
return springContext.getBean(clazz);
}
}
这只是我的想法,因为我不知道你的用例:你真的需要抽象吗?你真的有一个域模型,其中一个域类有几个需要工厂的子类。