單子模式要滿足以下幾點
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 在類的內部定義並產生那個唯一的...