(三)單例模式

2021-06-27 05:10:33 字數 2503 閱讀 1844

這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單

一、獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件:皇帝 

中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦) ,大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖: 

然後我們看程式實現,先定乙個皇帝: 

package com.cbf4life.singleton1; 

/** 

* @author cbf4life [email protected] 

* i'm glad to share my knowledge with you all. 

* 中國的歷史上一般都是乙個朝代乙個皇帝,有兩個皇帝的話,必然要pk出乙個皇帝出來 

*/ public class emperor  

public static emperor getinstance() 

return emperor; 

} //皇帝叫什麼名字呀 

public static void emperorinfo() 

} 然後定義大臣: 

package com.cbf4life.singleton1; 

/** 

* @author cbf4life [email protected] 

* i'm glad to share my knowledge with you all. 

* 大臣是天天要面見皇帝,今天見的皇帝和昨天的,前天不一樣那就出問題了! 

*/ @suppresswarnings("all") 

public class minister  

} 看到沒,大臣天天見到的都是同乙個皇帝,不會產生錯亂情況,反正都是乙個皇帝,是好是壞就這一

個,只要提到皇帝,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個例的,如同一

個時期同乙個朝代有兩個皇帝,怎麼辦? 

單例模式很簡單,就是在建構函式中多了加乙個建構函式,訪問許可權是 private 的就可以了,這個模

式是簡單,但是簡單中透著風險,風險?什麼風險?在乙個 b/s 專案中,每個 http request 請求到 

j2ee

的容器上後都建立了乙個執行緒,每個執行緒都要建立同乙個單例物件,怎麼辦?,好,我們寫乙個通用的單例程

序,然後分析一下: 

package com.cbf4life.singleton3; 

/** 

* @author cbf4life [email protected] 

* i'm glad to share my knowledge with you all. 

* 通用單例模式 

*/ @suppresswarnings("all") 

public class singletonpattern  

public singletonpattern getinstance()    

return this.singletonpattern; 

} } 

我們來看黃色的那一部分,假如現在有兩個執行緒 a 和執行緒b,執行緒 a 執行到 this.singletonpattern  = w singletonpattern(),正在申請記憶體分配,可能需要 0.001 微秒,就在這 0.001 微秒之內,執行緒 b 執行到 if(this.singletonpattern == null),你說這個時候這個判斷條件是 true 還是 false?是 true,那然後呢?執行緒b也往下走, 於是乎就在記憶體中就有兩個singletonpattern的例項了, 看看是不是出問題了?

如果你這個單例是去拿乙個序列號或者建立乙個訊號資源的時候,會怎麼樣?業務邏輯混亂!資料一致性校驗失敗!最重要的是你從**上還看不出什麼問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而慄吧,那怎麼修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案: 

package com.cbf4life.singleton3; 

/** 

* @author cbf4life [email protected] 

* i'm glad to share my knowledge with you all. 

* 通用單例模式 

*/ @suppresswarnings("all") 

public class singletonpattern  

public synchronized static singletonpattern getinstance() 

} 接 new 乙個物件傳遞給類的成員變數 singletonpattern,你要的時候 getinstance()直接返回給你,解決問題! 

(三)單例模式

這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單 一 獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件 皇帝 中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在...

設計模式三 單例模式

單例模式也是建立型模式的一種,也是23種設計模式中比較簡單的一種。見名思意,在整個軟體系統中,只有某個型別的乙個物件,並且訪問他的地方也只有乙個,也就是只有乙個全域性物件訪問點,這個例項或物件被所有是應用程式所共享 很多可以使用到這樣的功能模組 比如資料庫連線池物件 印表機物件,因為整個系統中,資料...

設計模式 三 單例模式

package zzq.designpatterns.creativepattern import lombok.data 單例 singleton 模式的定義 指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。例如,windows 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器...