java設計模式之五 —— 單例模式的三種模式優缺點整理

本來一直以爲單例很簡單,不打算整理了。不過本着求學需嚴謹的心態,還是去看了一下。確實有所收穫。

單例模式:單例模式的意思就是隻有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。

單例模式有三種:懶漢式單例,餓漢式單例,登記式單例。

1.懶漢式單例

public class Singleton {
private static Singleton singleton;
private Singleton() {} //此類不能被實例化
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
優點:第一次調用才初始化,避免內存浪費。
缺點:必須加鎖synchronized 才能保證單例,(如果兩個線程同時調用getInstance方法,會chuxia)但加鎖會影響效率。

2.餓漢式單例

public class Singleton {
private static final Singleton SINGLETON = new Singleton();
private Singleton() {} //此類不能被實例化
public static Singleton getInstance() {
return SINGLETON;
}
}
優點:沒有加鎖,執行效率會提高。
缺點:類加載時就初始化,浪費內存。

3.登記式模式(holder)

public class Singleton {
private Singleton() {} //構造方法是私有的,從而避免外界利用構造方法直接創建任意多實例。
public static Singleton getInstance() {
return Holder.SINGLETON;
}
private static class Holder {
private static final Singleton SINGLETON = new Singleton();
}
}
內部類只有在外部類被調用才加載,產生SINGLETON實例;又不用加鎖。此模式有上述兩個模式的優點,屏蔽了它們的缺點,是最好的單例模式。

而我之前一直使用的居然是懶漢式的單例,慚愧。

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