單例模式(Singleton Pattern),又稱單體模式,解決的問題是保證一個類在記憶體中對象的唯一性(類隻有一個執行個體)。
定義
将類的責任集中到唯一的單體對象中,確定該類隻有一個執行個體,并且為該類提供一個全局通路點。(難點不在單體模式的實作,在于系統中任何識别單體和保證單體的唯一性)
單例模式如何保證對象的唯一性?
- 不允許其他程式用new建立該對象。
- 在該類中建立一個本類執行個體。
- 對外提供一個方法讓其他程式擷取該對象。
單例模式保證對象唯一性的步驟?(和上面對應)
- 私有化構造函數。private Singleton(){—}。如果不把構造器聲明為private或protected,編譯器會自動建立一個public的構造函數。
- 使用靜态域(static)來維護執行個體。将單體對象作為單體類的靜态域執行個體化,其類型就是單例類型本身。private static Singleton s = null; 如果不想其被重載,加上final。
- 使用靜态方法監視執行個體的建立(分為餓漢式和懶漢式)。
// 餓漢式:
public class Singleton {
private final static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return s;
}
}
//懶漢式
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
return instance;
}
}
第一種叫餓漢式,開發時使用比較多,類一建立,對象就建立。這種方式浪費了記憶體。(記憶體中有靜态區和非靜态區)
第二種類加載時沒有對象,隻有調用了getInstance()方法時才會建立對象,此時建立的也是普通的執行個體,注意對比着看,這種事延遲加載,節省記憶體,但是在多線程并發通路時,可能保證不了對象的唯一性。
上一篇: 責任鍊模式
下一篇: 單例模式(二)