第52章

小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;

}

}