JAVA 設計模式之----單例模式

單例模式可以說是一種程序猿耳聞能詳的設計模式之一了。基本上所有的商業項目都會使用到它。那麼單例模式到底是什麼?它的作用又是什麼呢?在瞭解了它的本質、作用之後我們又應該如何實現它,優化它呢?

在實際開發中,由於邏輯需求,某些類在整個項目中只需要一個實例對象,並且它會被多次使用。這個時候我們就會考慮使用單例模式來實現這個類。單例模式的特點是:

1、在項目中只能存在一個實例。

2、單例類必須創建自己的唯一實例並且給其他類提供這個實例。

單例模式的作用很明確,它能夠避免實例對象的重複創建,不僅可以減少每次創建對象的時間開銷,還可以節約內存空間;能夠避免由於操作多個實例導致的邏輯錯誤。

單例模式實現方式有很多,下面我爲大家簡單的介紹4中實現方式:餓漢模式、懶漢模式(線程不安全)、雙重檢查模式、靜態內部類實現。

餓漢模式:

public class Singleton {
    
    private static Singleton singleton = new Singleton();

    /**
     * 必須私有化構造函數 讓外部不能通過 new 來實例對象
     */
    private Singleton() {

    }

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

懶漢模式(線程不安全):

public class Singleton {

    private static Singleton singleton;

    /**
     * 必須私有化構造函數 讓外部不能通過 new 來實例對象
     */
    private Singleton() {

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

雙重檢查模式:

public class Singleton {

    private static volatile Singleton singleton;

    /**
     * 必須私有化構造函數 讓外部不能通過 new 來實例對象
     */
    private Singleton() {

    }

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

靜態內部類單例模式:

public class Singleton {
    
    /**
     * 必須私有化構造函數 讓外部不能通過 new 來實例對象
     */
    private Singleton() {

    }

    public static Singleton getInstance() {
        return SingletonHolder.singleton;
    }

    private static class SingletonHolder {
        private static final Singleton singleton = new Singleton();
    }
}
使用靜態內部類單例模式不僅可以保證線程安全(資源消耗低),同時也能保證實例對象的唯一性。推薦使用這種方式實現單例模式。

其它還有一些實現方式這裏就不一一列舉了。希望這篇文章可以給大家一點借鑑作用。




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