




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章單例模式本章教學內容單例模式模式動機與定義模式結構與分析模式實例與解析模式效果與應用模式擴展引例
---讀取配置文件的內容
考慮這樣一個應用,讀取配置文件的內容。很多應用項目,都有與應用相關的配置文件,這些配置文件很多是由項目開發人員自定義的,在里面定義一些應用需要的參數數據。當然在實際的項目中,這種配置文件多采用xml格式,也有采用properties格式的,畢竟使用Java來讀取properties格式的配置文件比較簡單。現在要讀取配置文件的內容,該如何實現呢?
直接讀取文件的內容,然后把文件內容存放在相應的數據對象里面就可以了。真的這么簡單嗎?先實現看看吧。假設系統采用的是properties格式的配置文件。(1)直接使用Java來讀取配置文件的示例代碼如下:
//讀取應用配置文件publicclassAppConfig{
privateStringparameterA;//用來存放配置文件中參數A的值
privateStringparameterB;
//用來存放配置文件中參數B的值
publicStringgetParameterA(){
//注意:只有訪問參數的方法,沒有設置參數的方法
returnparameterA;
}
publicStringgetParameterB(){
returnparameterB;
}//構造方法
publicAppConfig(){//調用讀取配置文件的方法
readConfig();
}}
privatevoidreadConfig(){//讀取配置文件,把配置文件中的內容讀出來設置到屬性上
Propertiesp=newProperties();
InputStreamin=null;
try{
in=AppConfig.class.getResourceAsStream(
"AppCperties");
p.load(in);//把配置文件中的內容讀出來設置到屬性上
this.parameterA=p.getProperty("paramA");
this.parameterB=p.getProperty("paramB");
}catch(IOExceptione){
System.out.println("裝載配置文件出錯了,具體堆棧信息如下:");
e.printStackTrace();
}finally{
try{
in.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
(2)應用的配置文件,名字是AppCperties,放在AppConfig相同的包里面。簡單示例如下:paramA=aparamB=b(3)寫個客戶端來測試一下。示例代碼如下:publicclassClient{
publicstaticvoidmain(String[]args){//創建讀取應用配置的對象
AppConfigconfig=newAppConfig();
StringparamA=config.getParameterA();
StringparamB=config.getParameterB();System.out.println("paramA="+paramA+",paramB="+paramB);
}}
運行結果如下:
paramA=a,paramB=b有何問題
看看客戶端使用這個類的地方,是通過new一個AppConfig的實例來得到一個操作配置文件內容的對象。如果在系統運行中,有很多地方都需要使用配置文件的內容,也就是說很多地方都需要創建AppConfig對象的實例。換句話說,在系統運行期間,系統中會存在很多個AppConfig的實例對象,這有什么問題嗎?
當然有問題了,試想一下,每一個AppConfig實例對象里面都封裝著配置文件的內容,系統中有多個AppConfig實例對象,也就是說系統中會同時存在多份配置文件的內容,這樣會嚴重浪費內存資源。如果配置文件內容較少,問題還小一點,如果配置文件內容本來就多的話,對于系統資源的浪費問題就大了。事實上,對于AppConfig這種類,在運行期間,只需要一個實例對象就是夠了。把上面的描述進一步抽象一下,問題就出來了:在一個系統運行期間,某個類只需要一個類實例就可以了,那么應該怎樣實現呢?單例模式模式動機對于系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。單例模式模式動機如何保證一個類只有一個實例并且這個實例易于被訪問呢?定義一個全局變量可以確保對象隨時都可以被訪問,但不能防止我們實例化多個對象。一個更好的解決辦法是讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例被創建,并且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。單例模式模式定義單例模式(SingletonPattern):單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。單例模式是一種對象創建型模式。單例模式又名單件模式或單態模式。單例模式模式定義SingletonPattern:Ensureaclasshasonlyoneinstanceandprovideaglobalpointofaccesstoit.Frequencyofuse:mediumhigh
單例模式模式結構單例模式模式結構單例模式包含如下角色:Singleton:單例單例模式模式分析單例模式的目的是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。單例模式包含的角色只有一個,就是單例類——Singleton。單例類擁有一個私有構造函數,確保用戶無法通過new關鍵字直接實例化它。除此之外,該模式中包含一個靜態私有成員變量與靜態公有的工廠方法,該工廠方法負責檢驗實例的存在性并實例化自己,然后存儲在靜態成員變量中,以確保只有一個實例被創建。單例模式模式分析單例模式的實現代碼如下所示:單例模式模式分析在單例模式的實現過程中,需要注意如下三點:單例類的構造函數為私有;提供一個自身的靜態私有成員變量;提供一個公有的靜態工廠方法。單例模式單例模式實例與解析實例一:身份證號碼在現實生活中,居民身份證號碼具有唯一性,同一個人不允許有多個身份證號碼,第一次申請身份證時將給居民分配一個身份證號碼,如果之后因為遺失等原因補辦時,還是使用原來的身份證號碼,不會產生新的號碼。現使用單例模式模擬該場景。單例模式單例模式實例與解析實例一:身份證號碼單例模式單例模式實例與解析實例一:身份證號碼演示……單例模式單例模式實例與解析實例二:打印池在操作系統中,打印池(PrintSpooler)是一個用于管理打印任務的應用程序,通過打印池用戶可以刪除、中止或者改變打印任務的優先級,在一個系統中只允許運行一個打印池對象,如果重復創建打印池則拋出異常。現使用單例模式來模擬實現打印池的設計。單例模式單例模式實例與解析實例二:打印池單例模式單例模式實例與解析實例二:打印池演示……單例模式模式優缺點單例模式的優點提供了對唯一實例的受控訪問。因為單例類封裝了它的唯一實例,所以它可以嚴格控制客戶怎樣以及何時訪問它,并為設計及開發團隊提供了共享的概念。由于在系統內存中只存在一個對象,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的對象,單例模式無疑可以提高系統的性能。允許可變數目的實例。我們可以基于單例模式進行擴展,使用與單例控制相似的方法來獲得指定個數的對象實例。單例模式模式優缺點單例模式的缺點由于單例模式中沒有抽象層,因此單例類的擴展有很大的困難。單例類的職責過重,在一定程度上違背了“單一職責原則”。因為單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法,將產品的創建和產品的本身的功能融合到一起。濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;現在很多面向對象語言(如Java、C#)的運行環境都提供了自動垃圾回收的技術,因此,如果實例化的對象長時間不被利用,系統會認為它是垃圾,會自動銷毀并回收資源,下次利用時又將重新實例化,這將導致對象狀態的丟失。單例模式模式適用環境在以下情況下可以使用單例模式:系統只需要一個實例對象,如系統要求提供一個唯一的序列號生成器,或者需要考慮資源消耗太大而只允許創建一個對象。客戶調用類的單個實例只允許使用一個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該實例。在一個系統中要求一個類只有一個實例時才應當使用單例模式。反過來,如果一個類可以有幾個實例共存,就需要對單例模式進行改進,使之成為多例模式。單例模式模式應用(1)java.lang.Runtime類publicclassRuntime{privatestaticRuntimecurrentRuntime=newRuntime();publicstaticRuntimegetRuntime(){ returncurrentRuntime;}privateRuntime(){}......}單例模式模式應用(2)一個具有自動編號主鍵的表可以有多個用戶同時使用,但數據庫中只能有一個地方分配下一個主鍵編號,否則會出現主鍵重復,因此該主鍵編號生成器必須具備唯一性,可以通過單例模式來實現。單例模式模式應用(3)默認情況下,Spring會通過單例模式創建bean實例:
單例模式模式擴展餓漢式單例類單例模式模式擴展懶漢式單例類單例模式模式擴展餓漢式單例與懶漢式單例類比較餓漢式單例類在自己被加載時就將自己實例化。單從資源利用效率角度來講,這個比懶漢式單例類稍差些。從速度和反應時間角度來講,則比懶漢式單例類稍好些。懶漢式單例類在實例化時,必須處理好在多個線程同時首次引用此類時的訪問限制問題,特別是當單例類作為資源控制器,在實例化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味著出現多線程同時首次引用此類的機率變得較大,需要通過同步化機制進行控制。本章小結單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。單例模式是一種對象創建型模式。單例模式只包含一個單例角色:在單例類的內部實現只生成一個實例,同時它提供一個靜態的工廠方法,讓客戶可以使用它的唯一實例;為了防止在外部對其實例化,將其構造函數設計為私有。本章
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CNCA 053-2023礦用管路抓舉車通用技術條件
- T/CI 453-2024飼用谷子種植技術規程
- T/CGAS 031-2024城鎮燃氣加臭技術要求
- 上海護士招聘試題及答案
- T/CAS 850-2024燃氣用滾壓螺紋熱鍍鋅鋼管技術規范
- FIDIC業主咨詢工程師標準服務協議書條件白皮書5篇
- 三方債權債務的抵銷協議3篇
- 凈身出戶的離婚協議范文5篇
- 運輸化學危險品協議4篇
- 自來水 廠運維合同模板3篇
- 2025-2030中國個人征信行業發展現狀調研及前景預測分析研究報告
- 河南省青桐鳴大聯考普通高中2024-2025學年高三考前適應性考試語文試題及答案
- 訪談提綱格式4篇
- 能源經濟學第10章-能源投融資
- 鋼結構監理實施細則(全)
- 世界各個國家二字代碼表
- 附件_景觀工作面移交表
- TZ 324-2010 鐵路預應力混凝土連續梁(剛構)懸臂澆筑施工技術指南
- 年產20噸植物硒蛋白添加劑項目可行性研究報告模板
- 上海市安裝工程預算定額2000 說明
- 六十四卦爻象全圖(彩色)(共6頁)
評論
0/150
提交評論