單例模式解決的問題:保證一個類在內存中的對象唯一性。
如何保證對象唯一性?
答:1、爲了避免其他程序多次建立該類對象,不允許其他程序用new創建該類對象。
2、爲了讓其它程序可以訪問到該類對象,在該類創建一個本類實例。
3、爲了方便其它程序對自定義對象的訪問,對外提供一個方法讓其他程序可以獲取該對象。
步驟:
1、用private私有化該類構造函數。
2、通過new在本類中創建一個本類對象。
3、定義一個共有的方法,將創建的對象返回。
餓漢式:
Singleton類一進內存,就已經創建好了對象(由於單例模式就是爲了獲取對象,安全且簡單,故開發時比較常用)。
class Singleton {
private Singleton() { //
}
private static Singleton s = new Singleton();
public static Singleton getInstance() {
return s;
}
}
class SingleDemo {
public static void main(String[]) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}
懶漢式:
Singleton類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象(又稱爲延時加載,開發時幾乎不用)。
懶漢式的弊端:在多個對象同時調用getInstance方法時,需要加鎖,故效率不高。
class Singleton {
private Singleton() {
}
private static Singleton s = null;
public static Singleton getInstance() {
if(s == null) { //第一次爲null;之後不爲null,不會執行
synchronized(Singleton.class) {
if(s == null) { //二次判斷
s = new Singleton(); //實例化一個Singleton對象,之後不再實例化
}
}
return s;
}
}
}
class SingleDemo {
public static void main(String[]) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}