單例模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。
單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。
單例模式有以下特點:
1、單例類只能有乙個例項。
2、單例類必須自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項。
單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。例如每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。總之,選擇單例模式就是為了避免不一致狀態。
優點:
一、例項控制
單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。
二、靈活性
因為類控制了例項化過程,所以類可以靈活更改例項化過程。
缺點:
一、開銷
雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。
顯然單例模式的要點有三個:一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。 從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有乙個該類的靜態私有物件,三是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
——————————————————————————————————————————
懶漢式單例:
1
2
3
4
5
6
7
8
9
10
11
12
13
//懶漢式單例類.在第一次呼叫的時候例項化自己,延遲載入
publicclasssingleton
//靜態私有物件,保證該類只有乙個例項
privatestaticsingleton single=null;
//靜態工廠方法
publicstaticsingleton getinstance()
returnsingle;}}
以上懶漢式單例的實現沒有考慮執行緒安全問題,它是執行緒不安全的,併發環境下很可能出現多個singleton例項,要實現執行緒安全,有以下三種方式,都是對getinstance這個方法改造,保證了懶漢式單例的執行緒安全.
執行緒安全的問題:
1、在getinstance方法上加同步
1
2
3
4
5
6
public static synchronized singleton getinstance()
return single;
}2、雙重檢查鎖定
1
2
3
4
5
6
7
8
9
10
public static singleton getinstance()
}
}
return singleton;
}當然,如果getinstance()的程式用在頻繁執行的地方,就要重新考慮了,畢竟,同步乙個方法會使執行效率急速下降,這時要考慮使用,餓漢式單例模式。
餓漢式單例:
1
2
3
4
5
6
7
8
9
//餓漢式單例類.在類初始化時,已經自行例項化
publicclasssingleton1
privatestaticfinalsingleton1 single=newsingleton1();
//靜態工廠方法
publicstaticsingleton1 getinstance()
} jvm在載入這個類時,馬上建立此唯一的單件例項。jvm保證在任何執行緒訪問uniqueinstance靜態變數之前,一定先建立此例項。所以說餓漢式單例模式是天生安全的。當然這樣就喪失了延遲載入的優點。
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...