2012-04-17 18 views
0

私は3つの主要なクラスを持っています。A、B、Cと言います。 AはBとCの両方をインスタンス化します。BはまたCに依存します。これは問題ありません。 私の問題は、Aの実装がBとCの実装と密接に結びついていることです。 これをデカップリングしたいと思います。 私は春のフレームワークを使いたくありません。他の方法はありますか?私は彼らの(B、C)初期化のための工場を作ることを考えましたが、それはAまたはCがBにアクセスする必要があるときはいつでも、工場の新しいインスタンスを作成しなければならないことを意味します。 これをどのように解決すればよいですか? ここでIOCコンテナが便利かどうか分かりません。依存性注入混乱の実装

+0

これは明らかではありません。なぜAはBとCの実装に「緊密に結合」されていますか?簡単なサンプルコードを表示できますか? –

答えて

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); 

これは、これらの依存関係(したがって、依存性注入)でそれを注入することにより、B sおよびC Sをインスタンス化の詳細からAを切り離します。 実装からAを分離するために

、あなたはAが気にすることをBCの機能のためのインタフェースを作成することをお勧めします。言って、BableCableAは、コンストラクタパラメータとしてBableCableを受け入れることができ、それらのインタフェースを実装するクラスや実装の仕組みには関係なく、BableCableという契約に準拠しています。ここで

は、私が何を言っているかの完全に肉付けアウト例です:https://gist.github.com/2402514

+0

私は言及するのを忘れて、Aは "メインクラス"、コードのドライバです。私がBとCを抽象化すれば - 誰が実際に実装を作成するのですか?コンクリートB(bable)とC(cable)のインスタンス?だから、メインクラスが非常に多くのオブジェクトをインスタンス化するのは大丈夫ですか? – 12rad

+0

"コンポジションルート"に具体的なインスタンスを作成します。これは通常、アプリケーションのエントリポイント、つまりJavaの 'main()'です。 – Domenic

+0

ありがとう!わかった。 – 12rad

0

あなたはコンクリートがメンバ変数として保存、そのコンストラクタで使用すべきオブジェクトを指定することができます。この方法は、あなたが同様にC/CIfaceため

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 
} 

それを使用して(すなわち、Bと同じインターフェースを実装する)オブジェクトを複数回作成する必要はありませんし、他のクラスのオブジェクトを供給することができますこのように:

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); 
+0

私は言及するのを忘れて、Aは "メインクラス"、コードのドライバです。私がBとCを抽象化すれば - 誰が実際に実装を作成するのですか?コンクリートB(bable)とC(cable)のインスタンス?だから、メインクラスが非常に多くのオブジェクトをインスタンス化するのは大丈夫ですか? – 12rad

+0

'main()'メソッドで実行できます。クラスを簡単に渡すことができれば、必要なクラスをすべて作成しても問題ありません。 – Attila

+0

ありがとう!わかった – 12rad