這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單
一、獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件:皇帝
中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦) ,大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:
然後我們看程式實現,先定乙個皇帝:
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 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器...