Java 面試之單子模式

2021-09-21 02:05:50 字數 1957 閱讀 6421

單子模式要滿足以下幾點

1, 建構函式私有化,使得不能通過new來例項化物件

2,通過new在類的內部建立唯一的例項化物件

3,定義乙個公有的靜態的方法來返回上一部的物件

以下通過**來講解什麼餓漢模式

public class single 

//2 宣告乙個靜態的自己的類

private static single single = new single();

//3 返回乙個返回自己類的方法

public static single getinstance()

}

public class test 

}

執行結果

:test.main()

csdn.single@15db9742

csdn.single@15db9742

發現位址都一樣,說明例項化的是乙個物件

特點是不管物件有沒有為空,直接例項化

public class single2 

private static single2 single2;

public static single2 getinstance()

return single2;

}}

public class test 

}

執行結果:

:test.main()

csdn.single2@15db9742

csdn.single2@15db9742

可以看出位址是一樣的,懶漢模式一旦第一次例項化成功後,這個物件就不動了,因為是static

還有就是因為要判斷一次物件是否為空,這也是他和餓漢的區別,他相比較,例項化比較溫柔

但是由於在多執行緒操作下,物件判空這一項會受到多執行緒的影響,可能執行緒a進行了例項化但是執行緒b同時進行判空就會發生錯誤,所以就要對例項化判斷進行同步鎖的注入

**:

public class single3 

public static single3 getinstance()

}return single3;

}}

這樣就解決了多執行緒併發的錯誤

但還是缺點:每次呼叫方法時都要加鎖,而加鎖很耗時,所以在保證物件為null時只new出乙個例項時加鎖就夠了

改進如下:

public class single4 

public static single4 getinstance()}}

return single4;

}}

在靜態**塊中加入對該自身物件的例項化,因為jdk會在靜態**區中對其**僅執行一次

public class single5 

private static single5 single5;

static

//這裡不需要加鎖,因為他會在jdk區進行單執行緒的例項化

public static single5 getinstance()

}

結果:

:test.main()

csdn.single5@15db9742

csdn.single5@15db9742

如果按上面的方法,在執行靜態方法後會對程式產生影響,為了避免這個問題,改進乙個內部類的手段進行優化:

public class single6 

//建立內部類

private static class nested

}public static single6 getinstance()

}

以上就是所有的單子模式,歡迎補充

模式四(單子模式)

單例類只能有乙個例項,單例類必須自己建立自己的唯一例項,單例類必須給所有其他物件提供這一事例。using system using system.collections.generic using system.text namespace factory public static singlet...

2010 02 23 設計模式之單子模式

單子模式的經典應用 思路比較清晰,寫的過程也比較明白,希望跟我一起在學習開發的人學可以好好參考下 using system using system.collections.generic using system.text namespace singletion 第二步 在外不能new它,那要用...

6 單子模式(單例模式)

一 功能 保證在整個應用中只有乙個例項存在。例如只建立乙個視窗,jdbc連線資料庫程式只連線乙個等 二 概念 對某個類只能存在乙個物件例項,並且該類提供了乙個取得其物件例項的方法。三 單子模式第一種寫法 步驟 1 首先私有化構造器,這樣在外部就不能隨意new物件了 2 在類的內部定義並產生那個唯一的...