Ensure a class has only one instance, and PRovide a global point of access to inspect.
確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。
由于單例模式在內(nèi)存中只有一個實例,減少了內(nèi)存開支,特別是一個對象需要頻繁地創(chuàng)建、銷毀時,而且創(chuàng)建或銷毀時性能有無法優(yōu)化,單例模式的優(yōu)勢就非常明顯。
由于單例模式只生成一個實例,所以減少了系統(tǒng)的性能開銷,當(dāng)一個對象的產(chǎn)生需要較多的資源時,如讀取配置,產(chǎn)生其他依賴對象時,則可以通過在應(yīng)用啟動時直接產(chǎn)生一個單例對象,然后永久駐留內(nèi)存的方式來解決(javaEE需要注意JVM垃圾回收機制)
單例模式可以避免對資源的多重占用,例如一個寫文件動作,由于只有一個實例存在內(nèi)存中,避免對同一個資源文件的同時寫操作。
單例模式可以在系統(tǒng)設(shè)置全局變量的訪問點,優(yōu)化和共享資源訪問,例如可以設(shè)計一個單例類,負責(zé)所有數(shù)據(jù)表的映射處理。
擴展困難。
對測試時不理的。
單例模式與單一職責(zé)原則有沖突。
生成唯一序列號。
共享數(shù)據(jù)。
創(chuàng)建一個對象需要消耗的資源過多,如IO或數(shù)據(jù)庫訪問等資源。
需要大量靜態(tài)常量和靜態(tài)方法的環(huán)境。
在spring中,Bean默認就是單實例,如果單例模式擴展一下變?yōu)橛泄潭ㄉ舷薜膶嵗J剑涂梢猿蔀槎嗬J剑鐢?shù)據(jù)庫連接池(?)。總之,單例模式是一種比較常見的設(shè)計模式,可能在沒有學(xué)習(xí)過單例模式之前就已經(jīng)運用了這種模式,或使用過,但未曾總結(jié)整理。
新聞熱點
疑難解答