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