設計模式————單例模式和有上限的多例模式


         單例模式和有上限的多例模式

      單例模式用一句話解釋就是一個類只能產生一個對象

      我們都知道可以用一個new 關鍵字來產生一個對象,然后new的時候就會調用相應的構造函數

      到這里我想如何控制類實例個數為1應該有了一點思路了

      就是把構造函數設置為private,就可以阻止外部類創建對象了(這里不考慮利用反射機制去創建)

      我們舉個例子順便給出代碼:

      一個國家只有一個領導人,然后有許多的公民。我們任何時候見到的領導都是一個。相對應的類圖如下:

      

    對應的代碼實現:

       

 

    

    運行結果:

        我是唯一的領導人

        我是唯一的領導人

    在給一個單例模式的通用類圖

    

    

    代碼為:

    

 

    這種形式的單例模式是線程安全的,這種模式也被稱為餓漢模式

    下面的是一種線程不安全的單例模式,也被稱為是懶漢模式

    

    現在就分析一下為什么這樣的寫法是線程不安全的

    該單例模式在低並發條件下不會出現問題。但是一旦系統壓力過大,並發量增加就會出現一個內存中出現多個實例的情況

    比如一個線程執行到 singleton = new Singleton(),但是因為對象的初始化需要時間,所以暫時singleton還是為空

    剛好在這個時候另外一個線程執行了 singleton == null 的判斷,此刻是滿足條件的。所以就導致兩個線程都獲得了singleton對象,即在內存中出現了兩個對象

    解決線程安全的方法第一種方法就是使用上面的餓漢模式去實現

    第二種解決方法就是在getInstance方法前面加上synchronized關鍵字。這種模式也叫線程安全的懶漢模式。

    具體實現如下:

    

    

    第三種解決方法為:在getInstance方法內部加上synchronized關鍵字

    具體實現如下:

    

     最后一個要說的就是單例模式的一個擴展:有上限的多例模式

       這樣的好處是我們可以決定內存中有多少個實例,可以修正單例模式帶來的性能問題。

     UML圖如下:

      

              

      具體代碼實現如下:

      

      

      測試代碼:

      

    運行結果:

    

 

    到此單例模式以及擴展的有上限的多例模式講解結束。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM