設計模式之一:單例模式

     單例模式(Singleton Pattern):

     定義:Ensure a class has only instance , and provide a global point of access to it.(確保某一個類只有一個實例,而且自動實例化並向整個系統提供這個實例)

     優點:

     1、在內存中只有一個實例,所以減少了內存開銷,特別是在一個對象需要頻繁地創建、銷燬時,而且創建或銷燬時性能又無法優化。單例模式的優勢非常明顯;

     2、避免對資源的多重佔用。例如寫文件動作,由於只有個實例存在內存中,避免對同一個資源文件的同時寫操作

     3、提供了對唯一實例的受控訪問。 

     4、允許可變數目的實例。 

    缺點:

    1、沒有接口,擴展困難。

    2、不適用於變化的對象,如果同一類型的對象總是要在不同的用例場景發生變化,單例就會引起數據的錯誤,不能保存彼此的狀態。

    3、濫用單例將帶來一些負面問題,如爲了節省資源將數據庫連接池對象設計爲的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認爲是垃圾而被回收,這將導致對象狀態的丟失。 

    4、單例類的職責過重,在一定程度上違背了“單一職責原則”。 

  

    適用場景:

    1、資源共享的情況下,避免由於資源操作時導致的性能或損耗等。如上述中的日誌文件,應用配置。 
    2、控制資源的情況下,方便資源之間的互相通信。如線程池等。 

    3、需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以採用單例模式

    

   UML圖:

     單例模式的幾種書寫方式:

     1.餓漢式單例:單例實例在類裝載時就構建  

     特點:線程安全   在類加載的同時已經創建好一個靜態對象,調用時反應速度快 

     

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

        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
             return singleton;
        }
    }
     2、懶漢式單例:單例實例在第一次被使用時構建,延遲初始化

     特點:    避免了餓漢式的那種在沒有用到的情況下創建事例,資源利用率高,不執行getInstance()就不會被實例,可以執行該類的其他靜態方法。但是多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況

 public class SingletonPattern()
    {
        private static SingletonPattern singleton  = null;
        
        private SingletonPattern()
        {

        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
            if(singleton == null)
            {
                //多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況
                singleton = new SingletonPattern ();
            }
             return singleton;
        }
    }
    3、雙重檢測單例:

    特點: 資源利用率高,不執行getInstance()就不被實例,可以執行該類其他靜態方法 但是第一次加載時反應不快

public class SingletonPattern()
    {
        private static SingletonPattern singleton  = null;
        
        private SingletonPattern()
        {

        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
            if(singleton == null)
            {
                //使用synchronized關鍵字,防止多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況
                synchronized (SingletonPattern.class) {
                                if (instance == null) {
                                        instance = new SingletonPattern();
                                }
                        }
            }
             return singleton;
        }
    }
   4、靜態內部類模式:

public class SingletonPattern()
    {
        
        private SingletonPattern()
        {

        }

        private static class SingletonHelp()
        {
            static  SingletonPattern singleton = new SingletonPattern();
        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
    
             return singleton;
        }
    }

    好了,這一章就寫到這,歡迎大家加入QQ羣:280993838 。或者關注我的公衆號:

    

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