java設計模式 第二講 單例模式

  • 單例模式: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會被初始化,此時類的私有構造函數會被調用,單例類的唯一實例就被創建出來了。單例類中一個最重要的特點是類的構造函數是私有的,從而避免外界利用構造函數直接創建出任意多的實例;而且由於構造函數私有,該類不能被繼承


    • 
      
      
      
      
      
    • 懶漢式單例類:第一次引用類時,才進行對象的實例化   
      publiic class Singleton{
           private static Singleton _instance = null;
      //構造方法私有,保證外界無法直接實例化
          private Singleton(){
          }
      //方法同步
         synchronized public static Singleton getInstance(){
           if(_instance == null){
                 _instance = new Singleton();
              }
           return _instance;
        }
      }
      
      說明:上述代碼中,對靜態方法getInstance()進行同步,以確保多線程環境下只創建一個實例,例如,若getInstance()方法未被同步,並且線程A和線程B同時調用此方法,則執行if(_instance == null)時都爲真,那麼這兩個線程都會創建一個對象,但使用了synchronized關鍵字就可解決這個問題。
  • 單例模式的優點:
    • 內存中只有一個實例,減少了開支;
    • 只生成一個實例,同樣減少了性能開銷;
    • 避免對資源的多重佔用(有點像操作系統中的原子操作)
    • 可在系統設置全局訪問點,優化和共享資源訪問;
  • 缺點:
    • 無法創建子類,擴展困難,必須修改代碼;
    • 對測試不利;
  • 使用場景:
    • 要求生成唯一序列號的環境;
    • 整個項目中需要一個共享訪問點或共享數據;
    • 創建一個對象需要消耗的資源較多時,如訪問IO和數據庫的資源;
    • 需定義大量的靜態常量和靜態方法的環境;
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章