小A:“師兄,單體模式的實現要怎麼去實現?”
大B:“1、提供唯一的私有構造器,避免多個單體(Singleton)物件被建立,這也意味著該單體類不能有子類,那宣告你的單例類為final是一個好主意,這樣意圖明確,並且讓編譯器去使用一些效能最佳化選項。如果有子類的話使用protected,protected的構造方法可以被其子類以及在同一個包中的其它類呼叫。私有構造器可以防止客戶程式設計師透過除由我們提供的方法之外的任意方式來建立一個例項,如果不把構造器宣告為private或protected,編譯器會自動的建立一個public的建構函式。2、使用靜態域(staticfield)來維護例項。將單體物件作為單體類的一個靜態域例項化。使用儲存唯一例項的static變數,其型別就是單例型別本身。需要的話使用final,使其不能夠被過載。”
例如:privatestaticRutimecurrentRuntime=newRuntime();
大B:“3、使用靜態方法(StaticMethod)來監視例項的建立。”
(1)載入時例項化
例如:
publicclassSingleton{
privatestaticfinalSingletonSingletoninstance=newSingleton();
privateSingleton(){
}
publicstaticsynchronizedSingletongetInstance(){
returnSingletoninstance;
}
}
publicclassSingleton{
privatestaticfinalSingleton?Singletoninstance=newSingleton();
privateSingleton(){
}
publicstaticsynchronizedSingletongetInstance(){
returnSingletoninstance;
}
}
(2)使用時例項化(惰性初始化):這樣做可以在執行時收集需要的資訊來例項化單體物件,確保例項只有在需要時才被建立出來。
例如:
publicclassSingleton{
privatestaticfinalSingletonSingletoninstance=null;
privateSingleton(){
//使用執行時收集到的需要的資訊,進行屬性的初始化等操作。
}
publicstaticsynchronizedSingletongetInstance(){
if(Singletoninstance……null){
Singletoninstance=newSingleton();
}
returnSingletoninstance;
}
}
publicclassSingleton{
privatestaticfinalSingletonSingletoninstance=null;
privateSingleton(){
//使用執行時收集到的需要的資訊,進行屬性的初始化等操作。
}
publicstaticsynchronizedSingletongetInstance(){
if(Singletoninstance……null){
Singletoninstance=newSingleton();
}
returnSingletoninstance;
}
}
大B:“4、單體物件的成員變數(屬性):即單體物件的狀態透過單例物件的初始化來實現成員變數的初始化。透過方法對單體物件的成員變數進行更新操作。”
例如:
publicclassSingleton{
privatestaticfinalSingletonSingletoninstance=null;
privateVectorproperties=null;
protectedSingleton(){
//使用執行時收集到的需要的資訊,進行屬性的初始化等操作。
}
privatestaticsynchronizedvoidsyncInit(){
if(Singletoninstance……null){
Singletoninstance=newSingleton();
}
}
publicstaticSingletongetInstance(){
if(Singletoninstance……null){
syncInit();
}
returnSingletoninstance;
}
publicsynchronizedvoidupdateProperties(){
//更新屬性的操作。
}
publicVectorgetProperties(){
returnproperties;
}
}
publicclassSingleton{
privatestaticfinalSingletonSingletoninstance=null;
privateVectorproperties=null;
protectedSingleton(){
//使用執行時收集到的需要的資訊,進行屬性的初始化等操作。
}
privatestaticsynchronizedvoidsyncInit(){
if(Singletoninstance……null){
Singletoninstance=newSingleton();
}
}
publicstaticSingletongetInstance(){
if(Singletoninstance……null){
syncInit();
}
returnSingletoninstance;
}
publicsynchronizedvoidupdateProperties(){
//更新屬性的操作。
}
publicVectorgetProperties(){
returnproperties;
}
}