寫在前面:
文中許多學習觀點來自於龍哥--左瀟龍博客。並非純原創,在此僅爲做筆記學習。
鏈接;http://www.cnblogs.com/zuoxiaolong/p/pattern2.html
在工作中,所有可以使用單例模式的類都有一個共性:
這個類沒有自己的狀態,換句話說,這些類無論你實例化多少個,其實都一樣的。更重要的一點是,這個類如果有兩個或兩個以上的實例的話,程序會產生程序錯誤或與現實相違背的邏輯錯誤。
這樣的話,如果我們不將這個類控制成單例的結構,應用中就會存在很多一模一樣的類實例,這會非常浪費系統的內存資源,而且容易導致錯誤甚至一定會產生錯誤,所以我們單例模式所期待的目標或者說使用它的目的,是爲了儘可能的節約內存空間,減少無謂的GC消耗,並且使應用可以正常運作。
總結:一個類能否做成單例,最容易區別的地方就在於:這些類,在應用中如果有兩個或倆個以上的實例會引起錯誤,又或者這些類在整個應用中,同一時刻有且只能有一種狀態。
一、做成單例的幾種方式:
第一種,最簡單不考慮併發性的:
public class Singleton {
//一個靜態的實例
private static Singleton singleton;
//私有化構造函數
private Singleton(){}
//給出一個公共的靜態方法返回一個單一實例
public static Singleton getInstance(){
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
-------------------------------------------------------------------------------------------
這種方式通過以下幾個地方來限制我們取到的實例是唯一的。
————————————————————————————————
1.靜態實例,帶有static關鍵字的屬性在每一個類中都是唯一的。
2.限制客戶端隨意創造實例,即私有化構造方法,此爲保證單例的最重要的一步。
3.給一個公共的獲取實例的靜態方法,注意,是靜態的方法,因爲這個方法是在我們未獲取到實例的時候就要提供給客戶端調用的,所以如果是非靜態的話,那就變成一個矛盾體了,因爲非靜態的方法必須要擁有實例纔可以調用。
4.判斷只有持有的靜態實例爲null時才調用構造方法創造一個實例,否則就直接返回。
第二種,考慮併發性的。
具體看鏈接原文。