




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章單例模式本章教學(xué)內(nèi)容單例模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展引例
---讀取配置文件的內(nèi)容
考慮這樣一個(gè)應(yīng)用,讀取配置文件的內(nèi)容。很多應(yīng)用項(xiàng)目,都有與應(yīng)用相關(guān)的配置文件,這些配置文件很多是由項(xiàng)目開發(fā)人員自定義的,在里面定義一些應(yīng)用需要的參數(shù)數(shù)據(jù)。當(dāng)然在實(shí)際的項(xiàng)目中,這種配置文件多采用xml格式,也有采用properties格式的,畢竟使用Java來(lái)讀取properties格式的配置文件比較簡(jiǎn)單。現(xiàn)在要讀取配置文件的內(nèi)容,該如何實(shí)現(xiàn)呢?
直接讀取文件的內(nèi)容,然后把文件內(nèi)容存放在相應(yīng)的數(shù)據(jù)對(duì)象里面就可以了。真的這么簡(jiǎn)單嗎?先實(shí)現(xiàn)看看吧。假設(shè)系統(tǒng)采用的是properties格式的配置文件。(1)直接使用Java來(lái)讀取配置文件的示例代碼如下:
//讀取應(yīng)用配置文件publicclassAppConfig{
privateStringparameterA;//用來(lái)存放配置文件中參數(shù)A的值
privateStringparameterB;
//用來(lái)存放配置文件中參數(shù)B的值
publicStringgetParameterA(){
//注意:只有訪問(wèn)參數(shù)的方法,沒有設(shè)置參數(shù)的方法
returnparameterA;
}
publicStringgetParameterB(){
returnparameterB;
}//構(gòu)造方法
publicAppConfig(){//調(diào)用讀取配置文件的方法
readConfig();
}}
privatevoidreadConfig(){//讀取配置文件,把配置文件中的內(nèi)容讀出來(lái)設(shè)置到屬性上
Propertiesp=newProperties();
InputStreamin=null;
try{
in=AppConfig.class.getResourceAsStream(
"AppCperties");
p.load(in);//把配置文件中的內(nèi)容讀出來(lái)設(shè)置到屬性上
this.parameterA=p.getProperty("paramA");
this.parameterB=p.getProperty("paramB");
}catch(IOExceptione){
System.out.println("裝載配置文件出錯(cuò)了,具體堆棧信息如下:");
e.printStackTrace();
}finally{
try{
in.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
(2)應(yīng)用的配置文件,名字是AppCperties,放在AppConfig相同的包里面。簡(jiǎn)單示例如下:paramA=aparamB=b(3)寫個(gè)客戶端來(lái)測(cè)試一下。示例代碼如下:publicclassClient{
publicstaticvoidmain(String[]args){//創(chuàng)建讀取應(yīng)用配置的對(duì)象
AppConfigconfig=newAppConfig();
StringparamA=config.getParameterA();
StringparamB=config.getParameterB();System.out.println("paramA="+paramA+",paramB="+paramB);
}}
運(yùn)行結(jié)果如下:
paramA=a,paramB=b有何問(wèn)題
看看客戶端使用這個(gè)類的地方,是通過(guò)new一個(gè)AppConfig的實(shí)例來(lái)得到一個(gè)操作配置文件內(nèi)容的對(duì)象。如果在系統(tǒng)運(yùn)行中,有很多地方都需要使用配置文件的內(nèi)容,也就是說(shuō)很多地方都需要?jiǎng)?chuàng)建AppConfig對(duì)象的實(shí)例。換句話說(shuō),在系統(tǒng)運(yùn)行期間,系統(tǒng)中會(huì)存在很多個(gè)AppConfig的實(shí)例對(duì)象,這有什么問(wèn)題嗎?
當(dāng)然有問(wèn)題了,試想一下,每一個(gè)AppConfig實(shí)例對(duì)象里面都封裝著配置文件的內(nèi)容,系統(tǒng)中有多個(gè)AppConfig實(shí)例對(duì)象,也就是說(shuō)系統(tǒng)中會(huì)同時(shí)存在多份配置文件的內(nèi)容,這樣會(huì)嚴(yán)重浪費(fèi)內(nèi)存資源。如果配置文件內(nèi)容較少,問(wèn)題還小一點(diǎn),如果配置文件內(nèi)容本來(lái)就多的話,對(duì)于系統(tǒng)資源的浪費(fèi)問(wèn)題就大了。事實(shí)上,對(duì)于AppConfig這種類,在運(yùn)行期間,只需要一個(gè)實(shí)例對(duì)象就是夠了。把上面的描述進(jìn)一步抽象一下,問(wèn)題就出來(lái)了:在一個(gè)系統(tǒng)運(yùn)行期間,某個(gè)類只需要一個(gè)類實(shí)例就可以了,那么應(yīng)該怎樣實(shí)現(xiàn)呢?單例模式模式動(dòng)機(jī)對(duì)于系統(tǒng)中的某些類來(lái)說(shuō),只有一個(gè)實(shí)例很重要,例如,一個(gè)系統(tǒng)中可以存在多個(gè)打印任務(wù),但是只能有一個(gè)正在工作的任務(wù);一個(gè)系統(tǒng)只能有一個(gè)窗口管理器或文件系統(tǒng);一個(gè)系統(tǒng)只能有一個(gè)計(jì)時(shí)工具或ID(序號(hào))生成器。單例模式模式動(dòng)機(jī)如何保證一個(gè)類只有一個(gè)實(shí)例并且這個(gè)實(shí)例易于被訪問(wèn)呢?定義一個(gè)全局變量可以確保對(duì)象隨時(shí)都可以被訪問(wèn),但不能防止我們實(shí)例化多個(gè)對(duì)象。一個(gè)更好的解決辦法是讓類自身負(fù)責(zé)保存它的唯一實(shí)例。這個(gè)類可以保證沒有其他實(shí)例被創(chuàng)建,并且它可以提供一個(gè)訪問(wèn)該實(shí)例的方法。這就是單例模式的模式動(dòng)機(jī)。單例模式模式定義單例模式(SingletonPattern):?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類,它提供全局訪問(wèn)的方法。單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式是一種對(duì)象創(chuàng)建型模式。單例模式又名單件模式或單態(tài)模式。單例模式模式定義SingletonPattern:Ensureaclasshasonlyoneinstanceandprovideaglobalpointofaccesstoit.Frequencyofuse:mediumhigh
單例模式模式結(jié)構(gòu)單例模式模式結(jié)構(gòu)單例模式包含如下角色:Singleton:?jiǎn)卫龁卫J侥J椒治鰡卫J降哪康氖潜WC一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。單例模式包含的角色只有一個(gè),就是單例類——Singleton。單例類擁有一個(gè)私有構(gòu)造函數(shù),確保用戶無(wú)法通過(guò)new關(guān)鍵字直接實(shí)例化它。除此之外,該模式中包含一個(gè)靜態(tài)私有成員變量與靜態(tài)公有的工廠方法,該工廠方法負(fù)責(zé)檢驗(yàn)實(shí)例的存在性并實(shí)例化自己,然后存儲(chǔ)在靜態(tài)成員變量中,以確保只有一個(gè)實(shí)例被創(chuàng)建。單例模式模式分析單例模式的實(shí)現(xiàn)代碼如下所示:?jiǎn)卫J侥J椒治鲈趩卫J降膶?shí)現(xiàn)過(guò)程中,需要注意如下三點(diǎn):?jiǎn)卫惖臉?gòu)造函數(shù)為私有;提供一個(gè)自身的靜態(tài)私有成員變量;提供一個(gè)公有的靜態(tài)工廠方法。單例模式單例模式實(shí)例與解析實(shí)例一:身份證號(hào)碼在現(xiàn)實(shí)生活中,居民身份證號(hào)碼具有唯一性,同一個(gè)人不允許有多個(gè)身份證號(hào)碼,第一次申請(qǐng)身份證時(shí)將給居民分配一個(gè)身份證號(hào)碼,如果之后因?yàn)檫z失等原因補(bǔ)辦時(shí),還是使用原來(lái)的身份證號(hào)碼,不會(huì)產(chǎn)生新的號(hào)碼。現(xiàn)使用單例模式模擬該場(chǎng)景。單例模式單例模式實(shí)例與解析實(shí)例一:身份證號(hào)碼單例模式單例模式實(shí)例與解析實(shí)例一:身份證號(hào)碼演示……單例模式單例模式實(shí)例與解析實(shí)例二:打印池在操作系統(tǒng)中,打印池(PrintSpooler)是一個(gè)用于管理打印任務(wù)的應(yīng)用程序,通過(guò)打印池用戶可以刪除、中止或者改變打印任務(wù)的優(yōu)先級(jí),在一個(gè)系統(tǒng)中只允許運(yùn)行一個(gè)打印池對(duì)象,如果重復(fù)創(chuàng)建打印池則拋出異?!,F(xiàn)使用單例模式來(lái)模擬實(shí)現(xiàn)打印池的設(shè)計(jì)。單例模式單例模式實(shí)例與解析實(shí)例二:打印池單例模式單例模式實(shí)例與解析實(shí)例二:打印池演示……單例模式模式優(yōu)缺點(diǎn)單例模式的優(yōu)點(diǎn)提供了對(duì)唯一實(shí)例的受控訪問(wèn)。因?yàn)閱卫惙庋b了它的唯一實(shí)例,所以它可以嚴(yán)格控制客戶怎樣以及何時(shí)訪問(wèn)它,并為設(shè)計(jì)及開發(fā)團(tuán)隊(duì)提供了共享的概念。由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象,因此可以節(jié)約系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建和銷毀的對(duì)象,單例模式無(wú)疑可以提高系統(tǒng)的性能。允許可變數(shù)目的實(shí)例。我們可以基于單例模式進(jìn)行擴(kuò)展,使用與單例控制相似的方法來(lái)獲得指定個(gè)數(shù)的對(duì)象實(shí)例。單例模式模式優(yōu)缺點(diǎn)單例模式的缺點(diǎn)由于單例模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。單例類的職責(zé)過(guò)重,在一定程度上違背了“單一職責(zé)原則”。因?yàn)閱卫惣瘸洚?dāng)了工廠角色,提供了工廠方法,同時(shí)又充當(dāng)了產(chǎn)品角色,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)建和產(chǎn)品的本身的功能融合到一起。濫用單例將帶來(lái)一些負(fù)面問(wèn)題,如為了節(jié)省資源將數(shù)據(jù)庫(kù)連接池對(duì)象設(shè)計(jì)為單例類,可能會(huì)導(dǎo)致共享連接池對(duì)象的程序過(guò)多而出現(xiàn)連接池溢出;現(xiàn)在很多面向?qū)ο笳Z(yǔ)言(如Java、C#)的運(yùn)行環(huán)境都提供了自動(dòng)垃圾回收的技術(shù),因此,如果實(shí)例化的對(duì)象長(zhǎng)時(shí)間不被利用,系統(tǒng)會(huì)認(rèn)為它是垃圾,會(huì)自動(dòng)銷毀并回收資源,下次利用時(shí)又將重新實(shí)例化,這將導(dǎo)致對(duì)象狀態(tài)的丟失。單例模式模式適用環(huán)境在以下情況下可以使用單例模式:系統(tǒng)只需要一個(gè)實(shí)例對(duì)象,如系統(tǒng)要求提供一個(gè)唯一的序列號(hào)生成器,或者需要考慮資源消耗太大而只允許創(chuàng)建一個(gè)對(duì)象。客戶調(diào)用類的單個(gè)實(shí)例只允許使用一個(gè)公共訪問(wèn)點(diǎn),除了該公共訪問(wèn)點(diǎn),不能通過(guò)其他途徑訪問(wèn)該實(shí)例。在一個(gè)系統(tǒng)中要求一個(gè)類只有一個(gè)實(shí)例時(shí)才應(yīng)當(dāng)使用單例模式。反過(guò)來(lái),如果一個(gè)類可以有幾個(gè)實(shí)例共存,就需要對(duì)單例模式進(jìn)行改進(jìn),使之成為多例模式。單例模式模式應(yīng)用(1)java.lang.Runtime類publicclassRuntime{privatestaticRuntimecurrentRuntime=newRuntime();publicstaticRuntimegetRuntime(){ returncurrentRuntime;}privateRuntime(){}......}單例模式模式應(yīng)用(2)一個(gè)具有自動(dòng)編號(hào)主鍵的表可以有多個(gè)用戶同時(shí)使用,但數(shù)據(jù)庫(kù)中只能有一個(gè)地方分配下一個(gè)主鍵編號(hào),否則會(huì)出現(xiàn)主鍵重復(fù),因此該主鍵編號(hào)生成器必須具備唯一性,可以通過(guò)單例模式來(lái)實(shí)現(xiàn)。單例模式模式應(yīng)用(3)默認(rèn)情況下,Spring會(huì)通過(guò)單例模式創(chuàng)建bean實(shí)例:
單例模式模式擴(kuò)展餓漢式單例類單例模式模式擴(kuò)展懶漢式單例類單例模式模式擴(kuò)展餓漢式單例與懶漢式單例類比較餓漢式單例類在自己被加載時(shí)就將自己實(shí)例化。單從資源利用效率角度來(lái)講,這個(gè)比懶漢式單例類稍差些。從速度和反應(yīng)時(shí)間角度來(lái)講,則比懶漢式單例類稍好些。懶漢式單例類在實(shí)例化時(shí),必須處理好在多個(gè)線程同時(shí)首次引用此類時(shí)的訪問(wèn)限制問(wèn)題,特別是當(dāng)單例類作為資源控制器,在實(shí)例化時(shí)必然涉及資源初始化,而資源初始化很有可能耗費(fèi)大量時(shí)間,這意味著出現(xiàn)多線程同時(shí)首次引用此類的機(jī)率變得較大,需要通過(guò)同步化機(jī)制進(jìn)行控制。本章小結(jié)單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類,它提供全局訪問(wèn)的方法。單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式是一種對(duì)象創(chuàng)建型模式。單例模式只包含一個(gè)單例角色:在單例類的內(nèi)部實(shí)現(xiàn)只生成一個(gè)實(shí)例,同時(shí)它提供一個(gè)靜態(tài)的工廠方法,讓客戶可以使用它的唯一實(shí)例;為了防止在外部對(duì)其實(shí)例化,將其構(gòu)造函數(shù)設(shè)計(jì)為私有。本章
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鍍膜玻璃市場(chǎng)發(fā)展動(dòng)態(tài)及投資規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)鋰精礦行業(yè)競(jìng)爭(zhēng)格局規(guī)劃分析報(bào)告
- 2025-2030年中國(guó)鉑金首飾市場(chǎng)運(yùn)營(yíng)狀況及發(fā)展前景分析報(bào)告
- 2025-2030年中國(guó)軌道交通牽引變流器行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)箱紙板行業(yè)運(yùn)行動(dòng)態(tài)與發(fā)展建議分析報(bào)告
- 2025貴州省建筑安全員C證考試題庫(kù)
- 2025-2030年中國(guó)硫氰酸鈉市場(chǎng)運(yùn)營(yíng)現(xiàn)狀及發(fā)展規(guī)劃分析報(bào)告
- 撫順職業(yè)技術(shù)學(xué)院《安裝工程計(jì)量與計(jì)價(jià)》2023-2024學(xué)年第二學(xué)期期末試卷
- 伊春職業(yè)學(xué)院《平面制圖設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 隨州職業(yè)技術(shù)學(xué)院《科技文本翻譯》2023-2024學(xué)年第二學(xué)期期末試卷
- 中職歷史教學(xué)計(jì)劃
- NB-T+10499-2021水電站橋式起重機(jī)選型設(shè)計(jì)規(guī)范
- 六年級(jí)美術(shù)下冊(cè)全冊(cè)教案(浙美版)
- JT∕T 795-2023 事故汽車修復(fù)技術(shù)規(guī)范
- 湘教版二年級(jí)下冊(cè)美術(shù)教案
- 天津在津居住情況承諾書
- 2022年中考數(shù)學(xué)二輪專題復(fù)習(xí):二次函數(shù)性質(zhì)綜合題
- 男生青春期生理教育
- 現(xiàn)代漢語(yǔ)(黃伯榮、廖序東版)課件-第四章語(yǔ)法課件
- 統(tǒng)編版小學(xué)語(yǔ)文五年級(jí)下冊(cè)第四單元解讀與大單元設(shè)計(jì)思路
- 壓瘡護(hù)理質(zhì)控反饋
評(píng)論
0/150
提交評(píng)論