單例模式是最簡單的設計模式,很多大牛都不把它當作設計模式中的一種,因為設計模式的思想是**的復用和抽象,但是單例模式是將類的物件單一化。
所有的設計模式都只是前人經驗的總結,並不是說只有按照規定的**方式才是使用了某種設計模式,只要**復用程度高,抽象性好就是使用了設計模式,就可以在無數的設計模式中找到對應的。
單例就是只有乙個例子,只有乙個物件,不允許別人再建立物件。
餓漢式(初始化即建立物件)
class single
public static single getinstance()
}懶漢式(方法被呼叫時,才建立物件,也叫做物件的延時載入)
class single
public static single getinstance()
}懶漢式看似省空間,卻有可能在多執行緒時出問題。
舉個只有兩個執行緒的例子:執行緒a被單核cpu執行到①,單核cpu切入執行緒b去執行①,仍然會通過判斷,此時a,b都會執行語句②。
改進後的安全懶漢式(低效,在方法上增加了執行緒鎖):
class single
public static synchronized single getinstance()
}tips:
執行緒鎖就是synchronized後邊的引數,漢語版的api中作者稱之為物件監視器。執行緒鎖有兩個狀態,乙個鎖住乙個開啟,開啟的時候執行緒就能進去,關閉的時候,執行緒就會在門前等待,直到鎖開啟才會進去。
synchronized相當於乙個標示符表示它所跟隨的大括號內的內容是同步**塊,執行這部分**塊就要判斷執行緒鎖的狀態。
再次改進後最終的懶漢式(在方法內部增加執行緒鎖)
class single
public static single getinstance()
return s;}}
解析一下:執行緒a執行語句①通過,執行語句②通過,此時cpu切入執行緒b執行到語句①通過,執行到語句②未通過,
然後cpu切入執行緒a繼續執行,通過語句③和④並解除執行緒鎖,cpu再次切入執行緒b,此時會通過語句②,執行語句③,
如果沒有語句③又悲劇了。。。
總結,既然有這麼乙個單例類,肯定你是要用它的,你要用它一定會開闢記憶體存放它的物件,
懶漢實在是浪費時間又沒什麼實際意義,所以建議選擇餓漢式的單例模式。
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...