設計模式 單例模式

2021-06-22 10:36:48 字數 1719 閱讀 7090

首先宣告,此文整理自其它文獻,原作者用舉例的方式,將大道理解釋的淺顯易懂,初學設計模式者容易理解

下面進入正題:

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

一、獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件:皇帝,中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣,大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,

/**

* 中國的歷史上一般都是乙個朝代乙個皇帝

*/public class emperor

public static emperor getinstance()

return emperor;}

//皇帝叫什麼名字呀

public static void emperorinfo()

}

然後定義大臣:

/**

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

*/public class minister

}

看到沒,大臣天天見到的都是同乙個皇帝,不會產生錯亂情況,反正都是乙個皇帝,是好是壞就這乙個,只要提到皇帝,大家都知道指的是誰,清晰,而又明確。

單例模式很簡單,就是在建構函式中多了加乙個建構函式,訪問許可權是private 的就可以了,這個模式是簡單,但是簡單中透著風險,風險?什麼風險?在乙個b/s 專案中,每個http request 請求到j2ee的容器上後都建立了乙個執行緒,每個執行緒都要建立同乙個單例物件,怎麼辦?,好,我們寫乙個通用的單例程

序,然後分析一下:

/**

* 通用單例模式

*/public class singletonpattern

public singletonpattern getinstance()

return this.singletonpattern;

}}

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

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

/**

* 通用單例模式

*/public class singletonpattern

public synchronized static singletonpattern getinstance()

}

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

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...