天天看點

單例模式(一)

單例模式(Singleton Pattern),又稱單體模式,解決的問題是保證一個類在記憶體中對象的唯一性(類隻有一個執行個體)。

定義

将類的責任集中到唯一的單體對象中,確定該類隻有一個執行個體,并且為該類提供一個全局通路點。(難點不在單體模式的實作,在于系統中任何識别單體和保證單體的唯一性)

單例模式如何保證對象的唯一性?

  1. 不允許其他程式用new建立該對象。
  2. 在該類中建立一個本類執行個體。
  3. 對外提供一個方法讓其他程式擷取該對象。

單例模式保證對象唯一性的步驟?(和上面對應)

  1. 私有化構造函數。private Singleton(){—}。如果不把構造器聲明為private或protected,編譯器會自動建立一個public的構造函數。
  2. 使用靜态域(static)來維護執行個體。将單體對象作為單體類的靜态域執行個體化,其類型就是單例類型本身。private static Singleton s = null; 如果不想其被重載,加上final。
  3. 使用靜态方法監視執行個體的建立(分為餓漢式和懶漢式)。
// 餓漢式:
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()方法時才會建立對象,此時建立的也是普通的執行個體,注意對比着看,這種事延遲加載,節省記憶體,但是在多線程并發通路時,可能保證不了對象的唯一性。

上一篇: 責任鍊模式

下一篇: 單例模式(二)

繼續閱讀