單例模式主要是為了避免因為建立了多個例項造成資源浪費,且多個例項由於多次呼叫容易導致結果出現錯誤,使用單例模式就能夠寶成應用中有且只有乙個例項,保證乙個類在記憶體中的物件的唯一性。在一些常用的工具類、執行緒池、快取、資料庫等程式中,我們只能創乙個物件。
在上面我們說到現在解決問題的關鍵就是保證在應用中只有乙個物件就行了,那麼怎麼保證只有乙個物件呢?
- 不允許其他程式用new物件(私有化類的建構函式)
- 在該類中建立物件(通過new在本類中建立乙個本類的物件)
- 對外提供乙個獲取物件的方法
public
class singleton
private
static singleton instance = new singleton();
private
static singleton getinstance()
}
餓漢式提前例項化,沒有懶漢式中多執行緒問題,但不管我們是不是呼叫getinstance()都會存在乙個例項在記憶體中。
public
class singleton
private
static singleton instance;
public
static singleton getinstance()else
}
}
懶漢式就是在呼叫getinstance()時判斷是否存在例項,如果存在就直接返回,如果不存在就建立並返回。但是這樣就存在乙個問題,如果a和b同時呼叫getinstance()方法,因為呼叫時instance都為空,a和b就會建立兩個例項。解決的方法就是進行加鎖。
public
class singleton
private
static singleton instance;
public
static synchronized singleton getinstance()else
}
}
上面的**中我們給getinstance()函式新增了乙個鎖,即一次只能有乙個物件能呼叫這個方法。這個方法是可行的,但效率不高,因為當例項建立好之後,還是要用加鎖進訪問控制,效率不好。解決的方法就是==雙檢鎖寫法==
public
class singleton //私有構造方法
public
static singleton getsingle()
}
}
return single; //返回建立好的物件
}
}
雙檢鎖寫法只是在第一次建立的時候才會加鎖,當存在例項後直接返回。網路載入框架picasso就用了這種方法。
public
static picasso with(context context) }}
return singleton;
}
public
class singleton
private
class
singletonholedr()
private
static singleton getinstance()
}
內部類式中,實現了延遲載入,只有我們呼叫了getinstance(),才會建立唯一的例項到記憶體中.並且也解決了懶漢式中多執行緒的問題.解決的方式是利用了classloader的特性,內部靜態類只會被載入一次。 設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...