1. 程式人生 > >《設計模式之禪》-2.單例設計模式

《設計模式之禪》-2.單例設計模式

單例設計模式

定義

確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項

通用程式碼

public class Singleton{

    private static Singleton singleton = new Singleton();

    //私有化建構函式,不能從外部生成

    private Singleton(){

    }

    public static Singleton getSingleton(){

        return singleton;

    }

}

 

單例模式優點

1.由於單例模式在記憶體中只有一個例項,減少了記憶體開支,特別是一個物件需要頻繁地建立,銷燬時,而且建立或銷燬時效能無法優化,單例模式的優勢就非常明顯了

2.單例模式只生成一個例項,所以減少了系統的效能開銷,當一個物件的產生需要比較多的資源時,比如讀取配置,產生其他依賴物件時,則可以通過在應用中啟動時直接產生一個單例物件,然後用永久駐留記憶體的方式來解決

3.單例模式可以避免對資源的多重佔用,例如一個寫檔案動作,由於只有一個例項存在在記憶體中,避免對同一個資原始檔的同時寫訪問操作

4.單例模式可以在系統設定全域性的訪問點,優化和共享資源訪問

 

場景

1.要求生產唯一的序列碼

2.需要共享訪問點和共享資料時,比如計數器

3.建立一個物件需要消耗的資源過多,如要訪問IO和資料庫

4.需要定義大量的靜態常量和靜態方法時的環境(我們一般直接定義為static)

 

單例模式有兩種實現模式

分為餓漢式和懶漢式

 

懶漢式 是在呼叫時再產生單例物件 例

public class Singleton{

    private static Singleton singleton = null;

    //私有化建構函式,不能從外部生成

    private Singleton(){}

    public static Singleton getSingleton(){

        if(singleton == null){

            singleton = new Singleton();

        }

        return singleton;
    }

}

但是懶漢式會節省資源,但是會出現執行緒不安全的情況,可以使用synchronized關鍵字解決

 

餓漢式,則是在類初始化時就已經產生單例物件了

public class Singleton{

    private static Singleton singleton = new Singleton();

    //私有化建構函式,不能從外部生成

    private Singleton(){}

    public static Singleton getSingleton(){

        return singleton;

    }

}