單例模式應該是設計模式必然會提到的,面試的時候基本也都會考到,而且不僅要求知道,還要求手寫能夠寫出來。
首先說一下單例模式的意義:確保某乙個類只有乙個例項,並且提供乙個全域性訪問點。特點:1.乙個類只有乙個例項。2.必須自行例項化。3.向全域性提供例項。優點:節約系統資源、提高系統效率,同時也可以嚴格控制客戶對它的訪問。適用場景:1.需要頻繁的進行建立和銷毀的物件。2.建立物件時耗時過多或耗費資源過多,但又經常用到的物件。3.工具類物件。4.頻繁訪問資料庫或檔案的物件。
單例模式有三種寫法:
1.餓漢式
public class singleton
//餓漢式,在系統開始時就初始化例項
private static singleton instance = new singleton();
public static singleton getinstance()
}
2.懶漢式
public class singleton
//懶漢式,在需要的時候才初始化例項,但是由於synchronized,會影響效率
public static synchronized singleton getinstance()
return instance;
}}
3.dcl(double check lock)式:
public class singleton
private static singleton instance = new singleton();
//雙重檢查鎖方式
public static singleton getinstance() }}
return instance;
}}
public class singleton
private static class singletoninstance
public static singleton getinstance()
}
這種方式跟餓漢式方式採用的機制類似,但又有不同。兩者都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒。不同的地方在餓漢式方式是只要singleton類被裝載就會例項化,沒有lazy-loading的作用,而靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。
不過我在使用中主要用到的是第一種和第三種方式,我的同事比較喜歡用靜態內部類的方式,dcl和靜態內部類的方式是最合適的。
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...