天天看點

設計模式---單例設計模式(Singleton Pattern)

           在學習單例模式之前,首先我們必須明白為何需要單例模式。即單例模式存在的意義。考慮到

    這樣一種場景:在整個應用中某個類隻有一個獨一無二的執行個體,也就是"單例",例如筆者在以前完

    成的一個聊天程式的聊天視窗。有這樣一種需求,即是當聊天視窗已經打開的時候不在執行個體化它。

          基于上述描述,單例模式的存在是有其實際意義的!那麼,何為單例模式呢?

          單例模式:

                       單例模式指的是一個類僅有一個執行個體對象,并且提供對這個對象的一個全局通路點。

            單例模式類圖結構:

                  具體來說單例模式是如何實作的呢?下面是代碼:

                 由上述代碼可以看出Singleton類通過将構造方法限定為私有的(private),避免了類在外部

      被執行個體化。Singleton的唯一執行個體隻能通過getInstance方法得到。

                 Tips:實際上,通過反射機制是可以得到該執行個體對象的,不過這裡姑且不論!而且上述實’

      現在多線程的情況下也是不成立的。

                  觀察上述代碼可知,Singleton類中擁有一個Singleton類型的靜态常量,由該成員的初始化

      方式的不同,單例模式大體上可以分為兩種。

                 1、懶漢式單例模式:

                            把對象的建立放在方法中去,延遲了建立(懶得)。也就是上述代碼的實作。

                 2、餓漢式單例模式:

                           在聲明對象的時候初始化(急不可耐),實作代碼如下。

                   那麼,他們兩者具體又有什麼不同呢?

                    懶漢式模式,隻有外部對象第一次請求執行個體的時候才會去建立執行個體,運作時獲得對象的速度較慢

             但是,加載類的時候速度較快,在其整個的周期中隻有一部分時間占用資源。餓漢式模式正好與其

             相反。

                   前面提到,上述單例模式并不是線程安全的,沒有考慮到多線程的情況,解決方法如下:

                      1、 (使用鎖機制:就是線程對臨界區的通路權限)

                上述代碼還可以進一步優化:

                   2、使用雙重鎖

              此方法保證了對象在生命周期内隻能被鎖定一次,因而不會影響性能!推薦

繼續閱讀