我有三个主要的课程,比如A,B和C. A实例化B和C. B也依赖于C.B通过setter / getter方法访问C的对象。这可以。 我的问题是A的实现与B和C的实现紧密结合。 我想解开这个。 我不想使用弹簧框架。还有其他方法吗?我想为他们的(B,C)初始化创建工厂,但这意味着每当A或C需要访问B时,他们必须再次创建一个新的Factory实例..这似乎不对。 我该怎么解决这个问题? 我不确定IOC容器在这里是否有用?
答案 0 :(得分:1)
A
不应直接实例化B
或C
。它应该接受它们的实例作为构造函数参数:
public class A
{
private B b;
private C c;
public A(B b, C c)
{
this.b = b;
this.c = c;
}
}
// When creating your object graph, in the "composition root":
B b = new B();
C c = new C(b);
A a = new A(b, c);
这将A
与实例化B
和C
的细节分离开来,方法是将它们注入这些依赖项(因此,依赖注入)。
要将A
与实现分离,您需要为B
和C
A
关注Bable
和Cable
的功能创建接口关于。比方说,A
和Bable
。然后Cable
可以接受Bable
和Cable
的构造函数参数,而不关心实现这些接口的类是什么,或者实现如何工作 - 只是它符合{{1}}和{{1}}列出的合同。
以下是我所说的完全充实的例子:https://gist.github.com/2402514
答案 1 :(得分:0)
您可以指定A应在其构造函数中使用的具体对象,然后将它们存储为成员变量。这样您就不必多次创建对象,并且可以提供其他类的对象(例如,实现与B相同的接口)
public class A
{
private BIface b;
private CIface c;
public A(BIface b, CIface c) {
this.b = b;
this.c = c;
}
}
interface BIface {
// required B methods
}
public class B implments BIface
{
// implement the interface
}
类似于C / CIface
像这样使用:
BIface c = new C(); // or some other class also implementing CIface
BIface b = new B(c); // or some other class also implementing BIface
A a = new A(b, c);