大話JAVA設計模式之單例模式

俗話說:"天下大勢;合久必分,分久必合"

中華五千年的歷史文化,無數朝代的更迭,一次又一次的證明了這條規律的正確性;既然是規律那就一定不止在 “天下大勢” 方面出現,在很多其他的事物上也同樣有所體現。

比如,我們縮小一個單位量級,放在一個國家的層面來說,一個國家只能同時有一個皇帝,並且皇帝這個職位,也是''風水輪流轉,今年到我家'';而且每隔幾年總有那麼幾個皇帝幹着幹着不想幹撂挑子了或者乾脆被別人不想幹了(被別人搶了皇位);但是無論怎樣,我們都能發現,當皇帝的人總是隻有一個。正所謂:"一山不容二虎",否則會大事的。

歷史上倒還真出現過有兩個皇帝的時刻,那就是大明王朝;這種情況就出現了國家安全的問題,不可取。

 

單例模式三步曲

如果把皇帝這個職業的唯一性的特點,放到我們的軟件開發行業的話,同樣也有相通的地方,比如:在設計模式中就有單例模式,那麼何爲單例模式呢:


單例模式:保證整個系統中一個類只有一個對象的實例,實現這種功能的方式就叫單例模式


翻譯成白話文就是,整個系統中有且只有一個實例對象,這樣在我們的程序中就可以共享這個對象資源了,這也是設計模式中最簡單的一種設計模式,今天我們就來嘮嘮單例模式

剛纔從概念中,我們瞭解到了單例模式就是整個系統中只有一個實例對象,那麼問題來了,怎麼才能保證整個系統中只有一個對象實例呢?這就是接下來我們重點要探討的

要保證整個系統中對象只有一個,這裏就要借鑑宋丹丹老師當年把大象裝冰箱總結出的三部曲,所以保證對象的唯一性也只需要三步

  1. 私有化構造器
  2. 既然對象只有一個,那就不能隨便什麼人都能創建對象了,所以這裏要嚴格把控
  3. 自己創建對象
  4. 既然不讓別人創建對象,那就只能自己實例化來創建對象了
  5. 提供獲取對象的方法
  6. 因爲對象是自己創建的,所以我們還得提供一個方法其他人能夠拿到來使用

 

單例模式實現

上面咱們討論了單例模式的實現方式,三步走;這裏我們就要將理論轉化爲實踐;畢竟,實踐是檢驗真理的唯一標準;接下來上代碼

 

單例模式之餓漢式

聽到餓漢式這個名字,大家可能都可以想到一個飢腸轆轆的餓漢,這個時候他最需要的就是可以馬上有東西喫,所以單例模式的餓漢式就是在類剛被加載的時候,馬上就創建對象,生怕搶不到喫的

餓漢式雖好,但是總感覺還是有點問題,因爲它在類剛被加載的時候,就各種創建對象,如果我暫時還不需要的話,這樣其實是會造成資源的浪費的,所以還不完美,怎麼來解決這個問題呢;大家應該經常聽到懶加載這個詞,它的意思就是所有的事情我都不着急,只有你需要我的時候我纔出現,這個模式就是懶漢式

 

單例模式之懶漢式

懶漢式的方式就是,一開始比較懶,不去創建對象,等到程序需要我的時候,實在沒法再拖了,就只能創建對象了

這種方式看着不錯,不會有餓漢式的浪費資源;但卻帶來了另外一個問題,線程安全問題,這個問題在互聯網環境下的高併發的情況下,可能比資源浪費還要嚴重,對於多線程併發帶來的安全問題,我們可以使用加鎖synchronized關鍵字來解決

到這裏,線程安全問題也解決了,但是由於加鎖又帶來了性能的問題;真是一波未平一波又起啊,性能問題在也是極其重要的問題,這裏我們就要換一個思路了

 

單例模式之靜態內部類

這裏我們用靜態內部類的方式來實現單例模式

這種方式跟餓漢式方式採用的機制類似,但又有不同;兩者都是採用了類加載的機制來保證初始化實例時只有一個線程

 

不同

  1. 餓漢式是隻要Singleton類被加載就會實例化,沒有懶加載
  2. 靜態內部類方式是在需要實例化時,調用getInstance方法,纔會加載SingletonHolder類,實例化Singleton

由於類的靜態屬性只會在第一次加載類的時候初始化,所以在這裏我們也保證了線程的安全性,所以通過這種靜態內部類的方式解決了資源浪費和性能的問題

靜態資源內部類的方式也是我們比較推薦的一種寫法。

 

寫在後面的話:未來一段時間小課會持續輸出關於Java相關的文章,希望從零入門或者希望系統瞭解Java學習路線的可以持續關注我們哦。

喜歡我們的文章嗎?還想了解互聯網哪些技術,歡迎留言告訴我們

【AI課工場】互聯網知識也能如此好玩~

更多熱門互聯網技術文章搶先知微信公衆號【kgc-cn】

 

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