java設計模式之單例模式

 

一、定義

       保證一個類僅有一個實例,並提供一個可以訪問它的全局訪問點。

二、單例目前分類

      1.餓漢模式

            很好理解,餓漢就是十分着急要吃的,也就是迫切的創建對象,程序一加載就創建好了對象,等着被使用。可以想象當程序一旦加載,會有着大量單例對象被創建,等待被使用,如果沒有用到的話,將是一種資源的浪費,所以餓漢模式必須確定該對象會被使用。

      2.懶漢模式

            同理,懶漢則是當你使用的時候,纔去創建對象來使用。即延時加載,保證了創建的對象必然會被使用到。

三、代碼實例

保證多線程情況下只創建一個實例化對象。分別用餓漢式和懶漢式實現

懶漢式單例類:

public class LazySingleton {
    //volatile阻止進行寫操作的時候,不會進行讀操作
    private static volatile LazySingleton instance;

    private LazySingleton() {}

    public static LazySingleton getInstance() {
        //防止多線程下,每次都加鎖
        if (instance == null) {
            synchronized (LazySingleton.class) {
                //防止多線程下創建多個實例
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

    public void show() {
        System.out.println("懶漢式單例");
    }
}

餓漢式單例類:

public class HungrySingleton {

    //私有靜態內部類
    private static class SingletonHolder {
        private static final HungrySingleton INSTANCE = new HungrySingleton();
    }

    private HungrySingleton() {
    }

    public static HungrySingleton getInstance() {
        /*SingletonHolder被加載的時機也就是在getInstance()方法第一次被調用的時候
         避免了過早初始化,造成資源的浪費*/
        return SingletonHolder.INSTANCE;
    }

    public void show() {
        System.out.println("餓漢式單例");
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        HungrySingleton instance = HungrySingleton.getInstance();
        instance.show();

        LazySingleton instance1 = LazySingleton.getInstance();
        instance1.show();
    }
}

 

 

 

 

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