設計模式 單例模式

2021-06-23 09:44:34 字數 1202 閱讀 2187

單例模式是最簡單的設計模式,很多大牛都不把它當作設計模式中的一種,因為設計模式的思想是**的復用和抽象,但是單例模式是將類的物件單一化。

所有的設計模式都只是前人經驗的總結,並不是說只有按照規定的**方式才是使用了某種設計模式,只要**復用程度高,抽象性好就是使用了設計模式,就可以在無數的設計模式中找到對應的。

單例就是只有乙個例子,只有乙個物件,不允許別人再建立物件。

餓漢式(初始化即建立物件)

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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...