1. 程式人生 > >Java面試題設計模式篇單例模式

Java面試題設計模式篇單例模式

1 餓漢式-不要求延遲載入的情況下使用

餓漢方式一:Enum

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

餓漢方式二:靜態類變數

如果不需要延遲初始化,餓漢式可以接受,那麼可以採用下面的簡單方法實現:

  • 執行緒安全
  • 實現簡單
  • 類載入時便初始化例項
  • instance為靜態變數,利用靜態變數實現單例模式
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

2 懶漢式-明確需要延遲載入情況下

如果不想提前初始化例項,直到使用的時候才初始化。那麼採用懶漢式,相對複雜些。

懶漢方式一:靜態內部類延遲特性

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}
  • 靜態內部類本身延遲載入,只有呼叫時才會初始化
  • instance變數依舊式利用類的靜態變數保證單例實現,無法利用靜態內部類實現延遲載入,

懶漢方式二:雙重檢查鎖延遲初始化

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}