世界上並沒有完美的程序,但是我們並不因此而沮喪,因爲寫程序就是一個不斷追求完美的過程。
- 意圖
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。節省內存。用途:計數器,全局唯一ID、連接等。 - 類圖
- 實例
- 實例中只展示線程安全的實現方式
// 第一種,並且是最好的實現方式,枚舉,餓漢式
enum Single1{
SINGLETON;
public void sayHello(){
System.out.println("enum say hello");
}
}
// 第二種,常規餓漢式
class Single2{
private Single2(){}
private static final Single2 SINGLE = new Single2();
public static Single2 getInstance(){
return SINGLE;
}
public void sayHello(){
System.out.println("餓漢式 say hello");
}
}
// 第三種,靜態內部類,懶漢式,懶漢式首選
class Single3{
private Single3(){}
private static class SingleHolder{
private static final Single3 SNGLE = new Single3();
}
public static Single3 getInstance(){
return SingleHolder.SNGLE;
}
public void sayHello(){
System.out.println("inner static say hello");
}
}
// 雙重校驗鎖, 懶漢式
class Single4{
private Single4(){}
private static Single4 single4;
public static Single4 getInstance(){
if(null == single4){
synchronized (Single4.class){
if(null == single4){
return new Single4();
}
}
}
return single4;
}
public void sayHello(){
System.out.println("double judge say hello");
}
}
// 直接加鎖,懶漢式,效率最低
class Single5{
private Single5(){}
private static Single5 single5;
public static synchronized Single5 getInstance(){
if(null == single5){
return new Single5();
}
return single5;
}
public void sayHello(){
System.out.println("normal sync lazy say hello");
}
}
- 測試
class TestSingleton{
public static void main(String[] args) {
Single1.SINGLETON.sayHello();
Single2.getInstance().sayHello();
Single3.getInstance().sayHello();
Single4.getInstance().sayHello();
Single5.getInstance().sayHello();
}
}
運行結果:
enum say hello
餓漢式 say hello
inner static say hello
double judge say hello
normal sync lazy say hello