單例模式的理解及應用
阿新 • • 發佈:2018-12-10
單例模式
單例模式定義:定義:確保某個類只有一個例項,而且自行例項化提供給外部使用。 單例模式有很中比較常用的有懶漢模式和餓漢模式。注:我在網上查說的比較多的模式,在專案中比較常看到的有懶漢模式。餓漢模式沒怎麼看過。
懶漢模式:
public class SingleTon {
//宣告私有化
private static SingleTon singleTonInstance;
//將建構函式私有化
private SingleTon() {
}
//懶漢式
private static synchronized SingleTon getInstance (){
if (null==singleTonInstance){
singleTonInstance = new SingleTon();
}
return singleTonInstance;
}
}
優點:用到的時候才會去例項化,在一定程度上節約了資源。
缺點:getInstance方法是用synchronized修飾的,該方法是同步的,為了保證執行緒安全,但是導致每次呼叫該方法的時候都會被同步,這樣會消耗不必要的資源(不必要的同步開銷)。所以這種模式一般不建議使用。。
餓漢模式:
public class SingleTon {
//將建構函式私有化
private SingleTon() {
}
//建立私有例項物件
private static final SingleTon singleTonInstance = new SingleTon();
//對外提供方法,返回例項物件
public static SingleTon getInstance() {
return singleTonInstance;
}
優點:簡單,執行緒安全。
缺點:例項物件是static的,在宣告的時候就例項化了,浪費資源。 PS:還有一個雙重鎖定模式就是在懶漢模式新增一層synchronized。例項控制:Singln 會阻止其他物件例項化其自己的 Singln 物件的副本,從而確保所有物件都訪問唯一例項 靈活性:因為類控制了例項化過程,所以類可以更加靈活修改例項化過程
總結
在單例模式中構造方法必須寫的,而且構造方法必須去私有化。因為單例模式只會去例項化一次,不寫構造方法在java中會預設生成一個共有的構造方法。那樣的話就不是單例模式了。在構造方法中儘量不要去初始化引數,可以寫init方法代替進行初始化。構造方法初始化值會很麻煩(聽說的)。餓漢模式使用大多數情況是在多執行緒的情況下去使用的。 單例模式呼叫方法:類.getInstance().方法。