設計模式之單例模式(Singleton Pattern)

單例模式分析:

    單例模式主要是爲了不由於建立了多個實例形成資源的浪費,且多個實例因爲屢次調用容易致使結果出現錯誤,而使用單例模式可以保證整個應用中有且只有一個實例。從其名字中咱們就能夠看出所謂單例,就是單個實例也就是說它能夠解決的問題是:能夠保證一個類在內存中的對象的惟一性,在一些經常使用的工具類、線程池、緩存,數據庫,帳戶登陸系統、配置文件等程序中可能只容許咱們建立一個對象,一方面若是建立多個對象可能引發程序的錯誤,另外一方面建立多個對象也形成資源的浪費。java

單例模式的寫法分爲:

  • 懶漢式
  • 餓漢式
  • 雙重校驗鎖
  • 靜態內部類
  • 枚舉

詳細信息:

懶漢式:數據庫

public class Singleton {

    private Singleton(){}

    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){

        return instance;
    }
}

    優勢:這種方式的實現比較簡單,在類加載的時候就完成了實例化,避免了線程的同步問題緩存

    缺點:因爲在類加載的時候就實例化了,因此沒有達到Lazy Loading(懶加載)的效果,也就是說可能我沒              有用到這個實例,可是它也會加載,會形成內存的浪費。但這種浪費是能夠忽略的。安全

懶漢式[非線程安全]:工具

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){

        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

懶漢式[線程安全,效率低]:spa

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

    public static synchronized Singleton getInstance(){

        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }

}

懶漢式[線程安全,效率高]線程

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

餓漢式:code

public class Singleton {

    private static Singleton instance = null;
    static {
        instance = new Singleton02();
    }
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

內部類模式[推薦]:對象

public class Singleton {

    private Singleton(){}

    private static class SingletonHolder{
        private static Singleton instance = new Singleton();
    }

    public static Singleton getIntance(){
        return SingletonHolder.instance;
    }
}

枚舉模式[推薦]:內存

public enum SingletonEnum {

    instance;

    private SingletonEnum(){}

    public void method(){

        System.out.println("SingletonEnum");
    }
}
相關文章
相關標籤/搜索