版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Java簡單工廠簡單工廠不是一個(gè)標(biāo)準(zhǔn)的設(shè)計(jì)模式,但是它實(shí)在是太常用了,簡單而又神奇,所以還是需要好好掌握的,就當(dāng)是對學(xué)習(xí)設(shè)計(jì)模式的熱身運(yùn)動(dòng)吧。為了保持一致性,我們盡量按照學(xué)習(xí)其它模式的步驟來進(jìn)行學(xué)習(xí)。1場景問題大家都知道,在Java應(yīng)用開發(fā)中,要“面向接口編程”。那么什么是接口?接口有什么作用?接口如何使用?一起來回顧一下:1.1接口回顧(1)Java中接口的概念在Java中接口是一種特殊的抽象類,跟一般的抽象類相比,接口里面的所有方法都是抽象方法,接口里面的所有屬性都是常量。也就是說,接口里面是只有方法定義而不會(huì)有任何方法實(shí)現(xiàn)。(2)接口用來干什么通常用接口來定義實(shí)現(xiàn)類的外觀,也就是實(shí)現(xiàn)類的
2、行為定義,用來約束實(shí)現(xiàn)類的行為。接口就相當(dāng)于一份契約,根據(jù)外部應(yīng)用需要的功能,約定了實(shí)現(xiàn)類應(yīng)該要實(shí)現(xiàn)的功能,但是具體的實(shí)現(xiàn)類除了實(shí)現(xiàn)接口約定的功能外,還可以根據(jù)需要實(shí)現(xiàn)一些其它的功能,這是允許的,也就是說實(shí)現(xiàn)類的功能包含但不僅限于接口約束的功能。通過使用接口,可以實(shí)現(xiàn)不相關(guān)類的相同行為,而不需考慮這些類之間的層次關(guān)系,接口就是實(shí)現(xiàn)類對外的外觀。接口的思想根據(jù)接口的作用和用途,濃縮下來,接口的思想就是“封裝隔離”。通常提到封裝是指對數(shù)據(jù)的封裝,但是這里的封裝是指“對被隔離體的行為的封裝”,或者是“對被隔離體的職責(zé)的封裝”;而隔離指的是外部調(diào)用和內(nèi)部實(shí)現(xiàn),外部調(diào)用只能通過接口進(jìn)行調(diào)用,而外部調(diào)用是
3、不知道內(nèi)部具體實(shí)現(xiàn)的,也就是說外部調(diào)用和內(nèi)部實(shí)現(xiàn)是被接口隔離開的。(4)使用接口的好處由于外部調(diào)用和內(nèi)部實(shí)現(xiàn)被接口隔離開了,那么只要接口不變,內(nèi)部實(shí)現(xiàn)的變化就不會(huì)影響到外部應(yīng)用,從而使得系統(tǒng)更靈活,具有更好的擴(kuò)展性和可維護(hù)性,這也就是所謂“接口是系統(tǒng)可插拔性的保證”這句話的意思。(5)接口和抽象類的選擇既然接口是一種特殊的抽象類,那么在開發(fā)中,何時(shí)選用接口,何時(shí)選用抽象類呢?對于它們的選擇,在開發(fā)中是一個(gè)很重要的問題,特別總結(jié)兩句話給大家:優(yōu)先選用接口在如下情況應(yīng)選擇抽象類:既要定義子類的行為,又要為子類提供公共的功能1.2面向接口編程面向接口編程是Java編程中的一個(gè)重要原則。在Java程序
4、設(shè)計(jì)里面,非常講究層的劃分和模塊的劃分。通常按照三層來劃分Java程序,分別是表現(xiàn)層、邏輯層、數(shù)據(jù)層,它們之間都要通過接口來通訊。在每一個(gè)層里面,又有很多個(gè)小模塊,一個(gè)小模塊對外也應(yīng)該是一個(gè)整體,那么一個(gè)模塊對外也應(yīng)該提供接口,其它地方需要使用到這個(gè)模塊的功能,都應(yīng)該通過此接口來進(jìn)行調(diào)用。這也就是常說的“接口是被其隔離部分的外觀”?;镜娜龑咏Y(jié)構(gòu)如圖1所示:圖1基本的三層結(jié)構(gòu)示意圖在一個(gè)層內(nèi)部的各個(gè)模塊交互也要通過接口,如圖2所示:圖2一個(gè)層內(nèi)部的各個(gè)模塊交互示意圖各個(gè)部分的接口具體應(yīng)該如何去定義,具體的內(nèi)容是什么,不去深究,那是需要具體問題具體分析的,這里只是來學(xué)習(xí)設(shè)計(jì)的方法。上面頻頻提到“
5、組件”,那么什么是組件呢?先簡單的名詞解釋一下:所謂組件:從設(shè)計(jì)上講,組件就是能完成一定功能的封裝體。小到一個(gè)類,大到一個(gè)系統(tǒng),都可以稱為組件,因?yàn)橐粋€(gè)小系統(tǒng)放到更大的系統(tǒng)里面去,也就當(dāng)個(gè)組件而已。事實(shí)上,從設(shè)計(jì)的角度看,系統(tǒng)、子系統(tǒng)、模塊、組件等說的其實(shí)是同一回事情,都是完成一定功能的封裝體,只不過功能多少不同而已。繼續(xù)剛才的思路,大家會(huì)發(fā)現(xiàn),不管是一層還是一個(gè)模塊或者一個(gè)組件,都是一個(gè)被接口隔離的整體,那么下面我們就不去區(qū)分它們,統(tǒng)一認(rèn)為都是接口隔離體即可,如圖3所示:圖3接口隔離體示意圖既然在Java中需要面向接口編程,那么在程序中到底如何使用接口,來做到真正的面向接口編程呢?不用模式的
6、解決方案回憶一下,以前是如何使用接口的呢,假設(shè)有一個(gè)接口叫Api,然后有一個(gè)實(shí)現(xiàn)類Impl實(shí)現(xiàn)了它,在客戶端怎么用這個(gè)接口呢?通常都是在客戶端創(chuàng)建一個(gè)Impl的實(shí)例,把它賦值給一個(gè)Api接口類型的變量,然后客戶端就可以通過這個(gè)變量來操作接口的功能了,此時(shí)具體的結(jié)構(gòu)圖如圖4:+testl(s:String):void圖4基本的接口和實(shí)現(xiàn)還是用代碼來說明,會(huì)更清楚一些。(1)先定義接口Api,示例代碼如下:/*某個(gè)接口(通用的、抽象的、非具體的功能)*/publicinterfaceApi/*某個(gè)具體的功能方法的定義,用test1來演示一下這里的功能很簡單,把傳入的s打印輸出即可*params任意
7、想要打印輸出的字符串*/publicvoidtest1(Strings);(2)既然有了接口,自然就要有實(shí)現(xiàn),定義實(shí)現(xiàn)Impl,示例代碼如下:/*對接口的實(shí)現(xiàn)*/publicclassImplimplementsApipublicvoidtest1(Strings)System.out.println(NowInImpl.Theinputs=+s);3)那么此時(shí)的客戶端怎么寫呢?按照J(rèn)ava的知識(shí),接口不能直接使用,需要使用接口的實(shí)現(xiàn)類,示例代碼如下:/*客戶端:測試使用Api接口*/publicclassClientpublicstaticvoidmain(Stringargs)Apiapi
8、=newImpl();api.testl(哈哈,不要緊張,只是個(gè)測試而已!);1.4有何問題上面寫得沒錯(cuò)吧,在Java的基礎(chǔ)知識(shí)里面就是這么學(xué)的,難道這有什么問題嗎?請仔細(xì)看位于客戶端的下面這句話:然后再想想接口的功能和思想,發(fā)現(xiàn)什么了?仔細(xì)再想想?你會(huì)發(fā)現(xiàn)在客戶端調(diào)用的時(shí)候,客戶端不但知道了接口,同時(shí)還知道了具體的實(shí)現(xiàn)就是Impl。而接口的思想是封裝隔離”而Impl這個(gè)實(shí)現(xiàn)類,應(yīng)該是被接口Api封裝并同客戶端隔離開的,也就是說,客戶端根本就不應(yīng)該知道具體的實(shí)現(xiàn)類是Impl。有朋友說,那好,我就把Impl從客戶端拿掉,讓Api真正的對實(shí)現(xiàn)進(jìn)行封裝隔離”然后我們還是面向接口來編程??墒牵碌膯栴}
9、出現(xiàn)了,當(dāng)他把nepl去掉過后,發(fā)現(xiàn)他無法得到Api接口對象了,怎么辦呢?把這個(gè)問題描述一下:在Java編程中,出現(xiàn)只知接口而不知實(shí)現(xiàn),該怎么辦?就像現(xiàn)在的Client,它知道要使用Api接口,但是不知由誰實(shí)現(xiàn),也不知道如何實(shí)現(xiàn),從而得不到接口對象,就無法使用接口,該怎么辦呢?2解決方案1簡單工廠來解決用來解決上述問題的一個(gè)合理的解決方案就是簡單工廠,那么什么是簡單工廠呢?1:簡單工廠定義提供胡象實(shí)例阿能,而題關(guān)心典具険現(xiàn)。被創(chuàng)舷例的理可臥是接口,般類,也可以是具怵的類。2:應(yīng)用簡單工廠來解決的思路分析上面的問題,雖然不能讓模塊外部知道模塊內(nèi)的具體實(shí)現(xiàn),但是模塊內(nèi)部是可以知道實(shí)現(xiàn)類的,而且創(chuàng)建
10、接口是需要具體實(shí)現(xiàn)類的。那么干脆在模塊內(nèi)部新建一個(gè)類,在這個(gè)類里面來創(chuàng)建接口,然后把創(chuàng)建好的接口返回給客戶端,這樣外部應(yīng)用就只需要根據(jù)這個(gè)類來獲取相應(yīng)的接口對象,然后就可以操作接口定義的方法了。把這樣的對象稱為簡單工廠,就叫Factory吧。這樣一來,客戶端就可以通過這個(gè)Factory來獲取需要的接口對象,然后調(diào)用接口的方法來實(shí)現(xiàn)需要的功能,而且客戶端也不用再關(guān)心具體實(shí)現(xiàn)了。2.2簡單工廠結(jié)構(gòu)和說明簡單工廠的結(jié)構(gòu)如圖5所示:O已社(亡limn:int):ApiOti0n&:Strjig):yof&interfacedoAsiOIalA3*ourttiopL:strinidApi:定義客戶所需要
11、的功能接口Impl:具體實(shí)現(xiàn)Api的實(shí)現(xiàn)類,可能會(huì)有多個(gè)Factory:工廠,選擇合適的實(shí)現(xiàn)類來創(chuàng)建Api接口對象Client:客戶端,通過Factory去獲取Api接口對象,然后面向Api接口編程簡單工廠示例代碼(1)先看看Api的定義,示例代碼如下:/*接口的定義,該接口可以通過簡單工廠來創(chuàng)建*/publicinterfaceApi/*示意,具體的功能方法的定義*params示意,需要的參數(shù)*/publicvoidoperation(Strings);(2)定義了接口,該來實(shí)現(xiàn)它了,ImplA的示例代碼如下:/*接口的具體實(shí)現(xiàn)對象A*/publicclassImplAimplementsA
12、pipublicvoidoperation(Strings)/實(shí)現(xiàn)功能的代碼,示意一下System.out.println(ImplAs=+s);ImplB的示意實(shí)現(xiàn)和ImplA基本一樣,示例代碼如下:/*接口的具體實(shí)現(xiàn)對象B*/publicclassImplBimplementsApipublicvoidoperation(Strings)/實(shí)現(xiàn)功能的代碼,示意一下System.out.println(ImplBs=+s);3)該來看看簡單工廠的實(shí)現(xiàn),示例代碼如下工廠類,用來創(chuàng)造對象具體的創(chuàng)造對象的方法示意,從外部傳入的選擇條件創(chuàng)造好的對象應(yīng)該根據(jù)某些條件去選擇究竟創(chuàng)建哪一個(gè)具體的實(shí)現(xiàn)對象,
13、這些條/件可/以從外部傳入,也可以從其它途徑獲取。如果只有/一/個(gè)實(shí)現(xiàn),可以省略條件,因?yàn)闆]有選擇的必要。示意使/用/條件(4)再來看看客戶端的示意,示例代碼如下:/*客戶端,使用Api接口*/publicclassClientpublicstaticvoidmain(Stringargs)/通過簡單工廠來獲取接口對象Apiapi=Factory.createApi(1);api.operation(正在使用簡單工廠);使用簡單工廠重寫示例要使用簡單工廠來重寫前面的示例,主要就是要?jiǎng)?chuàng)建一個(gè)簡單工廠對象,讓簡單工廠來負(fù)責(zé)創(chuàng)建接口對象。然后讓客戶端通過工廠來獲取接口對象,而不再由客戶端自己去創(chuàng)建接口的對象了。此時(shí)系統(tǒng)的結(jié)構(gòu)如圖6所示。圖6使用簡單工廠重寫示例的結(jié)構(gòu)示意圖(1)接口Api和實(shí)現(xiàn)類Impl都和前面的示例一樣,就不去贅述了。2)新創(chuàng)建一個(gè)簡單工廠的對象,示例代碼如下:/*工廠類,用來創(chuàng)造Api對象*/publicclassFactory/*具體的創(chuàng)造Api對象的方法return創(chuàng)造好的Api對象*/publicstaticApicreateApi()/由于只有一個(gè)實(shí)現(xiàn),就不用條件判斷了returnnewImpl();3)使用簡單工廠客戶端如何使用簡單工廠提供的功能呢?這個(gè)時(shí)候,客戶端就不用再自己去創(chuàng)建接口的對象了,應(yīng)該使用工廠來獲取,經(jīng)過改造,客戶端代碼如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度愛奇藝體育賽事賽事直播內(nèi)容制作合同:股票投資回報(bào)保障協(xié)議3篇
- 二零二五年度環(huán)保型渣土運(yùn)輸船租賃合同3篇
- 二零二五年電子商務(wù)平臺(tái)運(yùn)營咨詢合同2篇
- 二零二五年度桉樹木材加工節(jié)能減排合同3篇
- 二零二五版醫(yī)療扶貧公益項(xiàng)目合同3篇
- 二零二五版股份收購項(xiàng)目風(fēng)險(xiǎn)評估及控制合同3篇
- 二零二五版生態(tài)旅游區(qū)建設(shè)項(xiàng)目招標(biāo)合同及生態(tài)保護(hù)協(xié)議3篇
- 二零二五版數(shù)據(jù)中心電梯緊急搶修及日常維護(hù)合同3篇
- 二零二五年度房產(chǎn)交易居間服務(wù)合同12篇
- 二零二五版國際農(nóng)業(yè)勞務(wù)輸出與管理合同3篇
- 2024年電信綜合部辦公室主任年度述職報(bào)告(四篇合集)
- 購銷合同電子版完整版
- 福建省福州市延安中學(xué)2023-2024學(xué)年八年級上學(xué)期期末物理模擬試卷+
- 2024年度醫(yī)院肝膽外科實(shí)習(xí)生帶教計(jì)劃課件
- 微機(jī)原理與接口技術(shù)考試試題及答案(綜合-必看)
- 勞務(wù)投標(biāo)技術(shù)標(biāo)
- 研發(fā)管理咨詢項(xiàng)目建議書
- 轉(zhuǎn)錢委托書授權(quán)書范本
- 一種配網(wǎng)高空作業(yè)智能安全帶及預(yù)警系統(tǒng)的制作方法
- 某墓園物業(yè)管理日常管護(hù)投標(biāo)方案
- 蘇教版六年級數(shù)學(xué)上冊集體備課記載表
評論
0/150
提交評論