設計模式01_單例模式.pdf

設計模式01_單例模式.pdf

ID:52647119

大?。?89.16 KB

頁數:7頁

時間:2020-03-29

設計模式01_單例模式.pdf_第1頁
設計模式01_單例模式.pdf_第2頁
設計模式01_單例模式.pdf_第3頁
設計模式01_單例模式.pdf_第4頁
設計模式01_單例模式.pdf_第5頁
資源描述:

《設計模式01_單例模式.pdf》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。

1、設計模式學習01—單例模式單例模式1、動機與定義系統(tǒng)中有些資源只能有一個,或者一個就夠,多個浪費。例如一個系統(tǒng)只能有一個窗口管理器或文件系統(tǒng)、一個系統(tǒng)只能有一個計時器或序號生成器、web系統(tǒng)只能有一個頁面計數器等等。此時,最好就需要把這些資源設置成有且僅有一個實例。代碼中也就是如何保證一個類只有一個實例并且這個實例能夠被訪問呢?只有一個實例的就意味著不能讓其他類來實例化,也就是只能自己實例化自己。能夠被訪問也就意味著自身要對外提供全局方法來獲取到這個實例,這就是單例模式。單例模式定義:確保某一個類只有一個實

2、例,而且自行實例化并且向整個系統(tǒng)提供這個實例。單例模式通常代表著系統(tǒng)具有唯一性的資源。主要有3點:只有一個實例;自行創(chuàng)建這個實例;自行向整個系統(tǒng)提供這個實例。2、結構與類圖單例模式是創(chuàng)建型模式,其實結構非常簡單,需要注意以下3點:1、構造方法私有:不讓外部實例化,只能將構造函數私有;2、提供一個公共靜態(tài)方法獲取實例:獲取這個實例前是沒有實例的,只能用靜態(tài)的。3、實例保存到自身靜態(tài)私有屬性上:獲取方法是靜態(tài)的,實例當然也只能是靜態(tài)的,最好是final的,單例不允許修改;通用類圖如下:代碼如下:1設計模式學習0

3、1—單例模式3、適用場景及效果(優(yōu)缺點)1、只需要1個實例,多了浪費,主要用于節(jié)約系統(tǒng)資源,創(chuàng)建一個對象需要消耗過多資源時,考慮將這個對象緩存,設計成單例的,如創(chuàng)建某些程序啟動配置對象讀取、操作系統(tǒng)的文件系統(tǒng)等,只需要創(chuàng)建一個就夠了,多了浪費;2、只需要1個實例,多了出錯,如計數器,唯一序列號生成器等;3、單例意味著多線程使用(如果單線程使用,單例完全沒有意義了),多線程下可以控制單一共享資源的訪問和線程間通訊,避免對同一資源的多重占用,如僅有1個打印機,各個線程自行調用會對一個資源多重占用,單例模式可以統(tǒng)

4、一管理對打印機的訪問,還有如數據庫連接池、線程池、日志應用等。4、大量無狀態(tài)的類實例,如需要大量靜態(tài)常量或方法(有時也可以定義成static)可以考慮使用單例模式,如web開發(fā)中的service層,都是業(yè)務無狀態(tài)的邏輯處理類,還有工具類和方法等,都可以設計成單例模式,這也是Spring框架中配置的bean默認都是單例的。優(yōu)點(使用后的效果):1、單例只有一個實例,也只創(chuàng)建一次,可以節(jié)約系統(tǒng)資源,特別當這個對象需要頻繁地創(chuàng)建和銷毀時,而且創(chuàng)建和銷毀要比較多的資源時;2、能避免對單一資源的多重占用,進行統(tǒng)一管理

5、。3、單例模式可以在系統(tǒng)設置全局訪問點,優(yōu)化和共享資源訪問。缺點:1、沒有接口,擴展困難,無法適應變化,基本上只能修改源碼。(為什么沒接口,就一個實例,接口沒意義);2、測試麻煩,單例沒完成,無法測試;3、與單一職責沖突。單例模式可以分為有狀態(tài)的和無狀態(tài)的,無狀態(tài)的單例對象不可變的,一般就是提供一些工具方法,有狀態(tài)的單例對象是可變的,常用來給系統(tǒng)當作狀態(tài)庫,提供一些狀態(tài),如序列號生成器等。2設計模式學習01—單例模式4、示例比如要做一個頁面計數器,可以使用單例模式,非常簡單,直接看代碼:5、模式擴展說到單例

6、模式,很多人想到的是如何創(chuàng)建單例模式,有很多種創(chuàng)建方法,懶漢、惡漢、雙重鎖等等,此處大概介紹一下。第一種(餓漢)3設計模式學習01—單例模式第二種(餓漢變種)第三種(懶漢)4設計模式學習01—單例模式第四種(懶漢變種)第五種(雙重鎖定檢查)5設計模式學習01—單例模式第六種(枚舉)第七種(靜態(tài)內部類)6設計模式學習01—單例模式單例模式創(chuàng)建方法有很多種,沒有最好的,只有最合適的,比如第七種方法比較好,但是沒必要為了一個不會出現(xiàn)的問題而使用很復雜的第七種模式,如果沒有需要延遲加載的地方(如讀取配置文件等),推

7、薦第一種模式,如果是JDK1.5以上,推薦使用枚舉的方法。單例模式還有個地方要注意,只有1個實例,雖然構造函數私有化,外邊不能new了,但是還有其他方式創(chuàng)建對象實例,如反序列化時,可能得到另一個實例,此時就要考慮序列化對單例的影響,還有不同類加載器(ClassLoader)對單例的影響等都要考慮。其實就是創(chuàng)建方式要支持的級別,這就需要根據實際情況,選擇你的創(chuàng)建方式了:1、每次從getInstance()都能返回一個且唯一的一個對象。2、希望這個方法能適應多線程并發(fā)訪問。3、并發(fā)時方法性能盡可能高。4、實現(xiàn)延

8、遲加載(LazyLoad),在需要的時候才被構造,而且要能夠處理業(yè)務邏輯。5、能夠處理多ClassLoader、多JVM,防止反序列化等情況。7

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內容,確認文檔內容符合您的需求后進行下載,若出現(xiàn)內容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。