設計模式之單例模式

什麼是單例模式?

單例模式就是一個類只能產生一個實例,如果控制一個類只能產生一個實例呢?

我們在創建對象時一般都是使用new來產生對象即調用類的構造方法,如果將構造方法私有化那麼就控制了外部類隨意創建對象的能力。

 

所以單例的實現可以總結爲:

1.構造方法私有化

2.類中含有一個本類型的靜態的私有化的屬性

3.對外提供一個靜態的返回本類型的靜態方法

 

單例模式的實現分爲懶漢式和餓漢式

 

餓漢式:

 

public class Singleton {

    // 構造器私有化
    private Singleton() {

    }

    // 私有化 靜態 本類型的屬性
    private static Singleton instance = new Singleton();

    // 對外提供一個靜態的返回本類型的方法
    public static Singleton getInstance() {

        return instance;
    }
}

 

 懶漢式

public class Singleton {

    // 構造器私有化
    private Singleton() {

    }

    // 私有化 靜態 本類型的屬性
    private static Singleton instance = null;

    // 對外提供一個靜態的返回本類型的方法
    public static Singleton getInstance() {

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

 

懶漢式的代碼在併發環境下回存在線程不安全的情況,即有可能會破壞單例模式,導致內存中出現對各SIngleton實例的情況,例如,如果線程A,B同時訪問getInstance()方法,當A進入 instance=new Singleton()時B線程訪問此時instance依然爲空,這是就會破壞單例模式

 

解決辦法

1.直接使用餓漢式

2.對懶漢式getInstance()方法添加synchronize關鍵字

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