Java 設計模式 ------ 單例模式
阿新 • • 發佈:2017-12-03
stat out instance bsp 問題 構造函數 程序開發 div .cn
在程序開發中,有時我們只需要一個對象就可以了,如日誌對象,工具類,怎麽樣保證整個應用程序中有且只有一個對象呢?這就要用到單例模式了,通過名字就可以看出來,它就是保證整個應用程序中只有一個實例的。單例,單例,就是單個實例。現在我們就看一下怎麽用Java代碼實現單例模式。
首先用Eclipse 創建一個Java項目,然後在src目錄下新建一個Singleton類,這個類就是用於創建單個對象,再新建一個Test類用於測試,最好還是指定一個包名
我們都知道創建對象上時候,要調用類的構造函數,但是每調用一次,都會創建一個新的對象,這和我們的創建單個對象不符。那要怎麽辦呢?首先不能讓外界調用類的構造函數,就是讓構造函數函私有化
// 構造函數私有化 private Singleton() { }
構造函數私有化之後,我們不能在外面創建對象了,但又引來了另外一個問題,我們需要的那一個對象也無法創建了,這就要對外提供一個方法來創建對象。我們在本類中創建一個對象,然後提供一個方法暴露出去,因為我們在本類是可以調用構造函數的。
// 對象的唯一實例 private static Singleton instance = new Singleton(); // 提供一個用於獲取實例的方法 public static Singleton getInstance() {return instance; }
這時我們就可以在外面通過類名獲取了,在Test類中測試一下
public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2); // true } }
創建的兩個對象s1, s2相等,證明,它們是同一個對象。以上單例模式的創建方式稱之為‘餓漢式‘,因為當類一加載的時候,這個唯一的對象就創建了。
現在我們再來考慮創建單例對象的另外一種模式, 稱之為‘懶漢式’, 就是我們在聲明私有屬性的時候,不去創建對象,只有在調用實例的時候才會去創建單例對象;
public class Singleton { // 構造函數私有化 private Singleton() { } // 只聲明了一個對象,而沒有進行賦值 private static Singleton instance; // 提供一個用於獲取實例的方法 public static Singleton getInstance() { if(instance == null) { // 當第一次調用的時候,創建單例對象 instance = new Singleton(); } return instance; } }
Java 設計模式 ------ 單例模式