0

私には3つの主要なクラスがあります。たとえば、A、B、Cです。AはBとCの両方をインスタンス化します。BもCに依存します。Bはsetter/getterメソッドを介してCのオブジェクトにアクセスします。これで結構です。私の問題は、Aの実装がBとCの実装と緊密に結合されていることです。これを切り離したい。SpringFrameworkは使いたくない。他に方法はありますか?(B、C)初期化用のファクトリを作成することを考えましたが、AまたはCがBにアクセスする必要があるときはいつでも、ファクトリの新しいインスタンスを再度作成する必要があることを意味します。これは正しくないようです。これをどのように解決すればよいですか?ここでIOCコンテナが役立つかどうかわかりませんか?

4

2 に答える 2

1

ABまたはを直接インスタンス化しないでください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);

これは、 sとsのAインスタンス化の詳細から、それらの依存性を注入することによって切り離します(したがって、依存性注入)。BC

実装Aから切り離すには、の機能とそれを気にするインターフェイスを作成する必要があります。言って、そして。次に、コンストラクターパラメーターとしてaとaを受け入れることができ、これらのインターフェイスを実装するためにどのクラスが発生するか、または実装がどのように機能するかは関係ありません。BCABableCableABableCableBableCable

これが私が話していることの完全に具体化された例です: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 に答える