控制反转(IoC) ? 工厂模式?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?不知道大家還記不記得當年程杰的《大話設計模式》了,最近一直想搞明白控制反轉到底是怎么回事,剛剛覺得高大上了一點,然后再進一步去學習去對比的時候才發現,以前早就接觸過這類的思想,設計原則的依賴倒轉和設計模式的工廠方法都很好的體現了這種思想,迫不及待的想要跟大家分享一下啦!
?
一、依賴倒轉原則
A.高層模塊不應該依賴低層模塊。兩個都應該依賴于抽象。
B.抽象不應該依賴細節,細節應該依賴于抽象。說白了就是,要針對接口編程,不要對實現編程。
????????在控制反轉的原理中,我們了解到,我們將對象的實例化放到了容器中,在產品實現的時候,我們直接調用接口,即容器將其所依賴的對象的引用傳遞到產品代碼中。IoC管理對象間的依賴關系,產品代碼只需要針對接口編程,而不再依賴于具體實現。與依賴倒轉原則如出一轍。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ?
二、工廠方法模式
????????定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
工廠方法遵循開放-封閉原則,并且保持了封裝對象創建過程的優點。
????????我們可以把IoC模式看做是工廠模式的升華,把IoC看做是一個大工廠,只不過這個大工廠里要生成的對象都是在XML文件中給出定義的,然后利用Java的“反射”編程,根據XML中給出的類名生成相應的對象。從實現來看,IoC是把以前在工廠方法里寫死的對象生成代碼,改變為由XML文件來定義,也就是把工廠和對象生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
?
? ? ? ? ? ? ? ? ? ?
?
三、反射
????????工廠方法也有缺點,就是每加一個產品,就需要加一個產品工廠的類,增加了額外的開發量。不知道大家還記不記得在書里,寫工廠方法的那一章,在最后一段話中,給大家留下了一個伏筆——反射。
????????在后面講到抽象工廠的時候,就提到了依賴注入的名詞。就拿抽象工廠來說,如果我們需要新增一個數據庫類型,就需要在代碼中添加一條分支條件,破壞了開閉原則,這個時候依賴注入本身是沒有能力解決這個問題的,但是如果我們利用語言支持反射機制,利用反射配置數據源,就可以避免分支判斷的問題。
????????讓我們想想,反射做了什么工作,我們工程一開始的難點出在對象最后都是需要new,實例化的,而我們只能實例化當前已有的類,不能對未來會添加的新類做處理,所以一旦有新的類加入,我們就必須修改代碼。但是,如果我們有一種方法,不是通過new,而是通過類的名字來實例化對象,那么我只需要將類的名字作為配置項,就可以實現不修改代碼的前提下加未來會出現的類。所以,我們可以毫不夸張的說,反射給了語言“預見未來”的能力,使得多態性和依賴注入的威力大增。
?
四、結束語
?
? ? ? ? ??看了一大堆資料,把以前的設計模式也翻出來研究了一番,畫畫圖,思路更加的清晰。IoC感覺就像”抽象工廠+反射+配置文件“,如圖,我們可以把AbstractFactory作為IoC容器,并且加入反射機制和配置文件,實現靈活配置類名。(解釋,配置文件取代ConcreFactory1和ConcreFactory2,具體用哪個,靈活配置類名即可;反射用在AbstractFactory里,取代分支判斷,避免了后期擴展修改代碼的弊病)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
???????? OK,面向對象無外乎那幾個原則,大道至簡的路,還很漫長,java的學習,才剛剛開始,加油吧!
總結
以上是生活随笔為你收集整理的控制反转(IoC) ? 工厂模式?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工厂方法模式与IoC/DI
- 下一篇: 细谈 对象的初始化过程------内存中