From:http://mp.weixin.QQ.com/s/RUUBn_VBmkPE8oE20IBleg 單例模式(Singleton Pattern):
1.定義: 確保某一個類只有一個實例,而且自動實例化并向整個系統提供這個實例
2.優點: 1、在內存中只有一個實例,所以減少了內存開銷,特別是在一個對象需要頻繁地創建、銷毀時,而且創建或銷毀時性能又無法優化。單例模式的優勢非常明顯; 2、避免對資源的多重占用。例如寫文件動作,由于只有個實例存在內存中,避免對同一個資源文件的同時寫操作 3、提供了對唯一實例的受控訪問。 4、允許可變數目的實例。
3.缺點: 1、沒有接口,擴展困難。 2、不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發生變化,單例就會引起數據的錯誤,不能保存彼此的狀態。 3、濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失。 4、單例類的職責過重,在一定程度上違背了“單一職責原則”。
4.適用場景: 1、資源共享的情況下,避免由于資源操作時導致的性能或損耗等。如上述中的日志文件,應用配置。 2、控制資源的情況下,方便資源之間的互相通信。如線程池等。 3、需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以采用單例模式
5.UML圖
6.單例模式的幾種書寫方式:
1/ 餓漢式單例:單例實例在類裝載時就構建 特點:線程安全 在類加載的同時已經創建好一個靜態對象,調用時反應速度快
public class SingleTonPattern(){ PRivate static SingletonPattern singleton=new SingletonPattern(); private SingletonPattern(){} //通過該方法獲取實例 public static SingletonPattern GetSingleton() { return singleton; }}2/ 懶漢式單例:單例實例在第一次被使用時構建,延遲初始化 特點: 避免了餓漢式的那種在沒有用到的情況下創建事例,資源利用率高,不執行getInstance()就不會被實例,可以執行該類的其他靜態方法。但是多個線程判斷instance都為null時,在執行new操作時多線程會出現重復情況
public class SingletonPattern(){ private static SingletonPattern singleton=null; private SingletonPattern(){} //通過該方法獲得實例對象 public static SingletonPattern GetSingleton() { if(singleton==null) { //多個線程判斷instance都為null時,在執行new操作時多線程會出現重復情況 singleton=new SingletonPattern(); } return singleton; }}3/ 雙重檢測單例: 特點: 資源利用率高,不執行getInstance()就不被實例,可以執行該類其他靜態方法 但是第一次加載時反應不快
public class SingletonPattern(){ private static SingletonPattern singleton=null; private SingletonPattern(){} //通過該方法獲得實例對象 public static SingletonPattern GetSingleton() { if(singleton==null) { //使用synchronized關鍵字,防止多個線程判斷instance都為null時,在執行new操作時多線程會出現重復情況 synchronized(SingletonPattern.class) { if(instance==null) { instance=new SingletonPattern(); } } } return singleton; }}4/ 靜態內部類模式:
public class SingletonPattern(){ private SingletonPattern(){} //通過該方法獲得實例對象 public static class SingletonHelp() { static SingletonPattern singleton=new SingletonPattern(); } //通過該方法獲得實例對象 public static SingletonPattern GetSingleton() { return singleton; }}新聞熱點
疑難解答