在实现工厂中避免循环依赖可以使用以下解决方法:
public interface Service {
void doSomething();
}
public class ServiceA implements Service {
private ServiceB serviceB;
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
@Override
public void doSomething() {
// 使用ServiceB的方法
serviceB.doSomething();
}
}
public class ServiceB implements Service {
private ServiceA serviceA;
public void setServiceA(ServiceA serviceA) {
this.serviceA = serviceA;
}
@Override
public void doSomething() {
// 使用ServiceA的方法
serviceA.doSomething();
}
}
public class ServiceFactory {
private ServiceA createServiceA() {
ServiceA serviceA = new ServiceA();
ServiceB serviceB = createServiceB();
serviceA.setServiceB(serviceB);
return serviceA;
}
private ServiceB createServiceB() {
ServiceB serviceB = new ServiceB();
ServiceA serviceA = createServiceA();
serviceB.setServiceA(serviceA);
return serviceB;
}
public Service getService() {
return createServiceA();
}
}
在上述示例中,ServiceA
和 ServiceB
之间存在循环依赖关系。为了解决循环依赖,ServiceFactory
使用延迟加载的方式,先创建代理对象,然后在需要时再创建实际的对象,并设置相应的依赖关系。
public interface Service {
void doSomething();
}
public class ServiceA implements Service {
private ServiceB serviceB;
public ServiceA(ServiceB serviceB) {
this.serviceB = serviceB;
}
@Override
public void doSomething() {
// 使用ServiceB的方法
serviceB.doSomething();
}
}
public class ServiceB implements Service {
private ServiceA serviceA;
public ServiceB(ServiceA serviceA) {
this.serviceA = serviceA;
}
@Override
public void doSomething() {
// 使用ServiceA的方法
serviceA.doSomething();
}
}
public class ServiceFactory {
public Service getService() {
ServiceA serviceA = new ServiceA(null);
ServiceB serviceB = new ServiceB(serviceA);
serviceA.setServiceB(serviceB);
return serviceA;
}
}
在上述示例中,ServiceA
和 ServiceB
通过构造函数注入彼此的依赖关系,确保在创建对象时已经解决了循环依赖。