天天看點

Spring IOC 與 工廠模式的差別

先簡單解釋幾個名詞。

IOC(控制反轉):

    将設計好的類交給系統控制,而不是類中控制。

DI(依賴注入):

    DI将依賴關系注入到元件中,使得複雜的IOC得以實作。

IOC容器:

    IOC+DI+Bean管理=IOC容器

-----------------------------------------------------------------------------

IOC/DI是軟體行業一步步優化得來的。

共有四個階段。

-----------------------------------------------------------------------------

第一階段:基礎多态思想

接口有A,

類B1,類B2實作了接口A。

C類中代碼{A a = new B1(); A aa = new B2();}

評價:對C類來說,C類主動完成了執行個體化對象,直接擷取依賴,【建立B1,并裝入A的對象a中】。

-----------------------------------------------------------------------------

第二階段:工廠模式階段

接口/抽象類 A,

類B1,類B2實作了接口A。

工廠類F 中存在着大部分建立對象的代碼。

C類中代碼{A a = F.createA("objectname");}

評價:對C來說是被動建立執行個體化對象,但對工廠來說是主動的。

補充工廠模式思想:

(簡單工廠思路)

1.建立一個抽象類A,抽象類有抽象方法M。當然A也可以是普通類或接口,反正方法M等着被重寫,方法體根本不重要。

2.編寫兩個具體實體類,繼承抽象類A。并實作抽象類的方法M.

3.編寫一個工廠類F,工廠類中有靜态方法。該方法識别傳入字元串,傳回具體的執行個體化對象。

4.用抽象類的對象aa  接收  工廠類建立的對象。然後aa.M()。這就實作了簡單工廠模式下的多态。

-----------------------------------------------------------------------------

第三階段:工廠模式+反射+xml

接口/抽象類 A,

類B1,類B2實作了接口A。

工廠類F 中存在着建立對象的通用代碼。讀取XML檔案獲得建立對象的相關配置。

xml檔案,描述了對象的相關配置和屬性。

C類中代碼{A a = F.createA("objectname");}

評價:對C和工廠類來說都是被動建立對象。

補充:這模式很難進行帶參數的類的建立以及在調用方法時傳遞值。

1.為什麼要使用反射。

答:簡單工廠的思路中第三點,工廠的靜态方法建立産品時,該方法識别傳入字元串,傳回具體

的執行個體化對象,這裡的一般會使用switch語句來識别傳入的字元串,在case中寫生産

具體的執行個體化對象的代碼。總接:使用反射可以省去switch語句,甚至不改動工廠也做到擴充新的具體類。

2.為什麼要使用xml。

答:之前的簡單工廠中,C類中建立一個執行個體化對象,對C來說是被動執行個體化對象,對工廠類來說是主動的,

主動的意思是工廠必須了解建立執行個體化對象的細節。使用xml配置檔案可以讓工廠也解放出來。

具體就是,工廠類使用配置檔案來決定要執行個體化的具體類。

3. 使用反射或xml都會有那些問題。

答:很難進行帶參數的類的建立,以及在調用方法時傳遞值。

-----------------------------------------------------------------------------

第四階段:IOC/DI 模式

接口/抽象類 A,

類B1,類B2實作了接口A。

沒有工廠類F

xml檔案,描述了對象的相關配置和屬性。

xml檔案編寫:

<bean id="b" class="com.tw.service.B">

</bean>

C類中代碼

{

    Application app = new XML(); 

    A aa = app.getBean("b"); 

            aa.M();

}

評價:

優點是-建立對象的控制權轉移,轉移到架構,維護成本低;缺點是-程式運作效率會低些。