單例模式辨析

描述:單例模式,在整個程序的運行過程中,自始自終只有一個對象的實例。

1.單例模式的用途
  
   如一個註冊表設置的對象,我們不希望這樣的對象有多份拷貝!否則那樣會把設置搞的一團糟。常常被用來管理共享的資源,還有如:數據庫連接或者線程池。

2.單例模式思考1

   一個全局變量也可以保證一個對象只有一個實例,那爲什麼還要使用單例模式來實現呢?試想一下,你要用全局變量的話,那是不是你需要講全局變量進行初始化,如果初始化的東西非常浪費資源且在實際中又不會用到初始化的東西。那豈不是浪費資源嗎? 是時候考慮單例模式了。單例模式可以使我們在需要的時候纔去初始化對象(具體實現參考下面的
單例模式實現1)。

3.特殊情況
   
遺憾的是,在多線程的情況下單例模式就失效了,多個線程會返回多個對象實例。要保證還是是隻返回一個對象,那我們就要讓多個線程像排隊一樣依次進入
getInstance() 方法,即:只有當一個線程跳出該方法後另一個線程才能進入該方法。這樣就能保證只有一個對象返回了。具體做法是將方法聲明爲:synchronized    如下:
  public    class     Singleton{
     private   static    
Singleton  uniqueInstance;
     priavte   Singleton(){}    //構造器爲私有,只有Singleton類本身才能實例化自己
     public   static   
synchronized      Singleton   getInstance() {
        if(null == uniqueInstance){
                 uniqueInstance = new Singleton(); //如果爲null,則調用自己的構造器來實例化一個對象
            }
        return   uniqueInstance;
    }

  }

 但加上synchronized 後 程序的運行效率要低很多。如果多線程訪問此方法頻繁的話,將會大大的降低程序運行效率,所以就要改變單例模式的實現方式:不受多線程控制,即:每個線程一開始就能得到一個對象的實例(和全局變量的實現方式差不多)。具體的實現就是下面的.單例模式實現2  ,所以具體選擇那種單例模式實現方式,要根據實際情況來決定。

2.單例模式實現1
  public    class     Singleton{
     private   static    
Singleton  uniqueInstance;
     priavte   Singleton(){}    //構造器爲私有,只有Singleton類本身才能實例化自己
     public   static   
Singleton   getInstance() {
        if(null == uniqueInstance){
                 uniqueInstance = new Singleton(); //如果爲null,則調用自己的構造器來實例化一個對象
            }
        return   uniqueInstance;
    }

  }

3.
單例模式實現2
  
public    class     Singleton{
     private   static    
Singleton  uniqueInstance  = new  Singleton  ();
     priavte   Singleton(){}    //構造器爲私有,只有Singleton類本身才能實例化自己
     public   static   
Singleton   getInstance() {
        return   uniqueInstance;
    }

  }


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