2012-04-17 144 views
0

我有三個主要類,可以說A,B和C. A實例化B和C. B也依賴於C. B通過setter/getter方法訪問C的對象。這可以。 我的問題是A的實現與B和C的實現緊密結合。 我想解耦這個。 我不想使用spring框架。有沒有其他方法?我想爲他們的(B,C)初始化創建工廠,但這意味着無論何時A或C需要訪問B,他們必須再次創建工廠的新實例..這看起來不正確。 我應該如何解決這個問題? 我不確定IOC容器在這裏有用嗎?實現依賴注入混淆

+0

這不是很清楚。爲什麼A與B和C的實現「緊密結合」?你能展示一些簡短的示例代碼嗎? – 2012-04-17 00:10:08

回答

1

A不應該直接實例化BC。應該代替接受它們的實例作爲構造參數:

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,你要爲B功能和CA大約關心創建界面。說,BableCable。然後A可以接受作爲其構造參數的BableCable,並且不關心實現這些接口的類是什麼,或者實現如何工作 - 只是它符合由BableCable規定的合約。

這裏是我談論的完全充實出例如:https://gist.github.com/2402514

+0

我忘了提及,A是代碼的驅動程序「主類」。如果我抽象出B和C - 誰實際創建了實現?即混凝土B(bable)和C(電纜)的情況?那麼,主類是否可以實例化這麼多的對象呢? – 12rad 2012-04-17 00:16:43

+0

您在「組合根」中創建具體實例。這通常是您的應用程序的入口點,即Java中的main()。 – Domenic 2012-04-17 00:19:50

+0

謝謝!我知道了。 – 12rad 2012-04-17 00:29:56

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

我忘了提及,A是代碼的驅動程序「主類」。如果我抽象出B和C - 誰實際創建了實現?即混凝土B(bable)和C(電纜)的情況?那麼,主類是否可以實例化這麼多的對象呢? – 12rad 2012-04-17 00:18:28

+0

你可以在'main()'方法中完成。如果能夠輕鬆地將它們傳遞出去,那麼創建所有需要的類都是完全可以的。 – Attila 2012-04-17 00:25:46

+0

謝謝!我知道了 – 12rad 2012-04-17 00:30:06