設計模式--------單例模式

單例設計模式

  1. 單例模式: 一個類只能有一個對象實例,且由該類能自行創建這個實例的實例

單例模式的特點

  1. 一個類只有一個實例對象
  2. 唯一的實例對象有這個單例類來創建
  3. 單例類爲對外提供一個訪問該類的全局訪問點

單例模式的幾種實現方式(附代碼)

     1. 懶漢模式:

   懶漢模式線程不安全,延遲加載,不是實際意義的上的單例模式

public class Singleton {
    private static Singleton instance;
    private Singleton (){}

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

    2. 餓漢模式

   線程安全,比較常用,但是容易比較產生垃圾,因爲一開始就進行初始化

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton (){}
    public static Singleton getInstance() {
        return instance;
    }  
}

    3. 雙重鎖模式

  線程安全,延遲初始化。這種方式採用雙鎖機制,安全且在多線程情況下能保持高性能。

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;
    }  
}

    4. 靜態內部類

只有第一次調用getInstance方法時,虛擬機才加載 Inner 並初始化instance ,只有一個線程可以獲得對象的初始化鎖,其他線程無法進行初始化,保證對象的唯一性。

public class Singleton {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    } 
 }

4. 單例模式的應用場景 

 Windows 的回收站、操作系統中的文件系統、多線程中的線程池、顯卡的驅動程序對象、打印機的後臺處理服務、應用程序的日誌對象、數據庫的連接池、網站的計數器、Web 應用的配置對象、應用程序中的對話框、系統中的緩存等常常被設計成單例。

on {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    }

 }

public class Singleton {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    }

 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章