設計模式(Java隨筆)—單例模式
阿新 • • 發佈:2018-12-13
單例模式(Singleton Pattern):5種建立型模式中的一種,有關單例模式的所有建立方法參考:Java單例模式——並非看起來那麼簡單(總結不易,感謝!),本文中,我只對開發中常用的兩種(多執行緒)方法和Java特有的列舉法進行程式碼複寫。
首先,還是貼一下單例的定義吧:
Ensure a class only has one instance,and provide a global point of access to it.
保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
開發常見一:雙重檢驗鎖(jdk1.5以後使用關鍵字volatile才有意義)
使用
//1、雙重檢驗鎖 jdk1.5以後才能使用關鍵字volatile class Singleton1{ private static volatile Singleton1 instance=null; private Singleton1(){} public static Singleton1 newInstance(){ if(instance==null){ synchronized (Singleton1.class) { if(instance==null){ instance=new Singleton1(); } } } return instance; } }
開發常見二:靜態內部類
//2、靜態內部類
class Singleton2{
private static class SingletonHolder{
public static Singleton2 instance=new Singleton2();
}
private Singleton2(){}
public static Singleton2 newInstance(){
return SingletonHolder.instance;
}
}
列舉實現單例:
//3、列舉
enum Singleton3{
instance;
public void method(){}
}
在已知的單例實現方法中,除了列舉法外,都有兩個共同的缺點,我直接貼過來吧;
- 需要額外的工作來實現序列化,否則每次反序列化一個序列化的物件時都會建立一個新的例項。
- 可以使用反射強行呼叫私有構造器(如果要避免這種情況,可以修改構造器,讓它在建立第二個例項的時候拋異常)。
而列舉類很好的解決了這兩個問題,使用列舉除了執行緒安全和防止反射呼叫構造器之外,還提供了自動序列化機制,防止反序列化的時候建立新的物件。
雙重校驗鎖和靜態內部類的方式可以解決大部分問題,平時工作中使用的最多的也是這兩種方式。列舉方式雖然很完美的解決了各種問題,但是這種寫法多少讓人感覺有些生疏。在沒有特殊需求的情況下,使用雙重校驗鎖和靜態內部類的方式實現單例模式。