我有三个主要的类,比如说 A、B 和 C。A 实例化 B 和 C。B 也依赖于 C。B 通过 setter/getter 方法访问 C 的对象。这可以。我的问题是 A 的实现与 B 和 C 的实现紧密耦合。我想解耦这个。我不想使用spring框架。还有其他方法吗?我想为他们的(B,C) 初始化创建工厂,但这意味着每当 A 或 C 需要访问 B 时,他们必须再次创建工厂的新实例。这似乎不对。我应该如何解决这个问题?我不确定 IOC 容器在这里是否有用?
问问题
141 次
2 回答
1
A
不应直接实例化B
or 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
s 和C
s 的细节分离,通过注入这些依赖项(因此,依赖注入)。
为了与实现分离A
,您B
需要为关心的功能C
创建接口。A
说,Bable
和Cable
。然后A
可以接受 aBable
和 a作为其构造函数参数,并且不关心实现这些接口的类发生了什么,或者实现是如何工作的——只要它符合andCable
制定的合同。Bable
Cable
这是我所说的一个完整的例子:https ://gist.github.com/2402514
于 2012-04-17T00:09:57.980 回答
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);
于 2012-04-17T00:11:35.070 回答