簡言:
客戶端不再需要是否實例化問題,把責任都給了應該負責的類去處理,其實就是一個基本的設計模式:單例模式
單例模式的定義:
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象,一個最好的辦法就是,讓類保存它的唯一實例,保證這個類沒有其它實例可以被創建,並且提供一個訪問該實例的方法。
單例的結構圖(網上查取)
通過代碼的形式實現一個簡單的單例模式:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
這是一個簡單的單例模式魔板:
單例除了唯一的實例外還有什麼好處?
單例模式因爲類封裝的唯一實例。這樣它就可以嚴格的控制客戶訪問它,何時訪問它,簡單的說是對唯一實例的受控訪問,。
多線程時的單例
多線程的程序中,多線程的程序中,多個線程同時,調用getInstance()方法,會有可能造成創建多個實例的,
可以給進程一把鎖來處理,這裏需要解釋一下lock語句的含義,lock是確保當一個線程位於代碼的臨界區時,另一個線程不進入臨界區,如果其他線程試圖進入鎖定的代碼。則將一直等待,直到該對象被釋放。
代碼如下:
public class Singleton {
private static Singleton instance;
private static Object syncRoot = new Object();
private Singleton(){}
public static Singleton getInstance(){
Lock(syncRoot) {
if(instance == null){
instance = new Singleton();
}
}
return instance;
}
}
靜態初始化
在實際應用當中,靜態初始化方法,這種方法不需要開發人員顯示地編寫線程安全代碼,即可解決線程環境下它是不安全的問題。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
是什麼是懶漢模式和惡漢模式:
這種靜態初始化的方式時在自己被加載時就將自己實例化,所以被形象的稱之爲餓漢式單例類
要是在第一次被引用時,纔會將自己實例化,所以就被稱之爲懶漢式單例類