0

我有三个主要的类,比如说 A、B 和 C。A 实例化 B 和 C。B 也依赖于 C。B 通过 setter/getter 方法访问 C 的对象。这可以。我的问题是 A 的实现与 B 和 C 的实现紧密耦合。我想解耦这个。我不想使用spring框架。还有其他方法吗?我想为他们的(B,C) 初始化创建工厂,但这意味着每当 A 或 C 需要访问 B 时,他们必须再次创建工厂的新实例。这似乎不对。我应该如何解决这个问题?我不确定 IOC 容器在这里是否有用?

4

2 回答 2

1

A不应直接实例化Bor 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实例化Bs 和Cs 的细节分离,通过注入这些依赖项(因此,依赖注入)。

为了与实现分离AB需要为关心的功能C创建接口。A说,BableCable。然后A可以接受 aBable和 a作为其构造函数参数,并且不关心实现这些接口的类发生了什么,或者实现是如何工作的——只要它符合andCable制定的合同。BableCable

这是我所说的一个完整的例子: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 回答