先簡單解釋幾個名詞。
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();
}
評價:
優點是-建立對象的控制權轉移,轉移到架構,維護成本低;缺點是-程式運作效率會低些。