我的域名包有一个名为MyInterface
的界面。我还有一个名为MyFactory
的工厂类,它应该有助于在运行时创建实现MyInterface的类的实例。
域层
interface MyInterface{
//some Domain specific methods here
}
class MyFactory{
public static MyInterface getInstance(Object resource) {
// return MyInterfaceImpl instance via the methods
// this Object can also be a Class argument, where I do
// Class.forName("").newInstance(); but this is a bad design.
}
class DomainServiceImpl {
public void domainMethod(Object res) {
MyInterface i = MyFactory.getInstance(res);
}
}
服务层
class Class1 implements MyInterface {
}
class Class2 implements MyInterface {
}
class ServiceClass {
public void service() {
domainServiceImpl.domainMethod(Object res);
}
}
那么我应该如何在域层中编写工厂方法来获取正确的服务层实例,而不使用if / else或switch并避免循环依赖。
选项:可以使用反射,但不知道如何使用。
答案 0 :(得分:0)
那么我应该如何在域层中编写工厂方法来获取正确的服务层实例,而不使用if / else或switch并避免循环依赖。
您正在寻找的概念称为“依赖注入”。 Misko Hevery发表了大量有关此主题的可访问材料。
在域层中,您为服务提供商定义接口,并通过构造函数将这些服务提供者注入您的实现
interface MyFactory {
public MyInterface getInstance(Object resource);
}
class DomainServiceImpl {
final MyFactory factory;
// "Dependency Injection"
public DomainServiceImpl(MyFactory factory) {
this.factory = factory
}
public void domainMethod(Object res) {
MyInterface i = MyFactory.getInstance(res);
}
}
然后从外面,您可以实施您需要的工厂。
class Class1MyFactory implements MyFactory {
public MyInterface getInstance() {
return ...;
}
}
并将其注入服务中的适当位置
class ServiceClass {
final domainServiceImpl;
public ServiceClass(DomainServiceImpl domainServiceImpl) {
this.domainServiceImpl = domainServiceImpl;
}
public void service() {
domainServiceImpl.domainMethod(Object res);
}
}
因此,当构建服务的时候,你选择你的依赖关系,然后离开你去....
MyFactory myFactory = new Class1MyFactory(...);
DomainServiceImpl domainServiceImpl = new DomainServiceImpl(myFactory)
ServiceClass service = new ServiceClass(domainServiceImple)