單例模式 第一章介紹 單例設計模式:保證類在記憶體中只有一個對象 第二章餓漢式(上來就創建私有的本類對象) /* * * 單例設計模式:保證類在記憶體中只有一個對象 */ public static void main(String[] args) { // Singleton s1= new Sing ...
單例模式
第一章介紹
單例設計模式:保證類在記憶體中只有一個對象
第二章餓漢式(上來就創建私有的本類對象)
/*
*
* 單例設計模式:保證類在記憶體中只有一個對象
*/
public static void main(String[] args) {
// Singleton s1= new Singleton(); //3.由於私有構造方法,類外無法直接new 對象
/*Singleton s1= Singleton.s;
Singleton s2= Singleton.s;
System.out.println(s1==s2);*/
//上述兩行會導致能夠修改s的值所以得私有成員變數
//5.重新通過get方法獲得成員變數
Singleton s1= Singleton.getInstance();
Singleton s2= Singleton.getInstance();
System.out.println(s1==s2);
}
}
/*
* 餓漢式
*/
class Singleton{
//1.私有構造方法,類外無法直接new 對象,其他類無法訪問該方法
private Singleton() {
}
//2.創建本類對象
// public static Singleton s =new Singleton();//會導致能夠修改s的值所以得私有成員變數
private static Singleton s =new Singleton();
//4.對外提供公共的訪問方法get方法
public static Singleton getInstance() {
return s;
}
}
第三章懶漢式(單例的延遲載入,用的時候再創建對象)
/*
* 懶漢式:單利模式的延遲載入模式
* 會有安全隱患
*/
class Singleton2 {
//1.創建本類對象,但不實例化
private static Singleton2 s;
//2.私有化構造方法
private Singleton2 () {
}
//3.對外提供公共的訪問方法
public static Singleton2 getInstance() {
if(s==null) {
//多線程情況下,當線程1進入if後等待,cpu使用權被線程2搶去了也進入了if判斷語句那麼最終會造成多個對象被創建出來
//所以懶漢式一般不使用
s=new Singleton2();
}
return s;
}
}
第四章餓漢式和懶漢式的區別
- 餓漢式是空間換時間,在伺服器啟動的時候就創建了對象
- 懶漢式是時間還空間,在用的時候再創建對象,但是不推薦本模式
- 在多線程訪問時,餓漢式不會創建多個對象,懶漢式有可能會創建多個對象
第五章單例模式的第三種方法final
class Singleton3 {
//1.創建本類對象,但不實例化
public static final Singleton3 s= new Singleton3();
//2.私有化構造方法
private Singleton3 () {
}
//3.對外提供公共的訪問方法
public static Singleton3 getInstance() {
return s;
}
}