- 單例模式:Ensure a class has only one instance,and provide a global point of access to it 確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例; 其作用是確保一個類只有一個實例存在
- 分類
- 餓漢式單例類:類加載時,就進行對象實例化
publiic class Singleton{ private static Singleton m_instance = new Singleton(); //構造方法私有,保證外界無法直接實例化 private Singleton(){ } //通過該方法獲得實例對象 public static Singleton getInstance(){ return m_instance; } //說明:從上述代碼中可以看到,在類被加載時,靜態變量m_instance會被初始化,此時類的私有構造函數會被調用,單例類的唯一實例就被創建出來了。單例類中一個最重要的特點是類的構造函數是私有的,從而避免外界利用構造函數直接創建出任意多的實例;而且由於構造函數私有,該類不能被繼承
- 懶漢式單例類:第一次引用類時,才進行對象的實例化
說明:上述代碼中,對靜態方法getInstance()進行同步,以確保多線程環境下只創建一個實例,例如,若getInstance()方法未被同步,並且線程A和線程B同時調用此方法,則執行if(_instance == null)時都爲真,那麼這兩個線程都會創建一個對象,但使用了synchronized關鍵字就可解決這個問題。publiic class Singleton{ private static Singleton _instance = null; //構造方法私有,保證外界無法直接實例化 private Singleton(){ } //方法同步 synchronized public static Singleton getInstance(){ if(_instance == null){ _instance = new Singleton(); } return _instance; } }
- 單例模式的優點:
- 內存中只有一個實例,減少了開支;
- 只生成一個實例,同樣減少了性能開銷;
- 避免對資源的多重佔用(有點像操作系統中的原子操作)
- 可在系統設置全局訪問點,優化和共享資源訪問;
- 缺點:
- 無法創建子類,擴展困難,必須修改代碼;
- 對測試不利;
- 使用場景:
- 要求生成唯一序列號的環境;
- 整個項目中需要一個共享訪問點或共享數據;
- 創建一個對象需要消耗的資源較多時,如訪問IO和數據庫的資源;
- 需定義大量的靜態常量和靜態方法的環境;
java設計模式 第二講 單例模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.