Singleton模式
在程序運行的時候常常是使用new
的方法創建一個實例。對於某一個類(例如工具類),如果我們希望在任何情況下該類只有一個實例的話,我們需要使用單例模式。單例模式是很簡單又被廣爲使用的一個設計模式:
public class Singleton {
//餓漢模式
private static Singleton singleton = new Singleton();
private Singleton(){
System.out.println("生成唯一的實例");
}
public static Singleton getSingleton(){
return singleton;
}
}
在程序運行時,當Singleton
首次被加載的時候,我們即創建了一個singleton
對象。當getSingleton
函數被調用的時候,我們將這個對象的引用返回給外部調用。這樣的話,不管調用多少次,getSingleton
函數返回的總是類加載時創建的singleton
對象。
可使用Main
中的函數判斷兩個實例是否爲同一個對象:
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
System.out.println(s1==s2?"s1 和 s2 相同":"s1 和 s2 不相同");
}
}
生成唯一的實例
s1 和 s2 相同
上面的方法又被稱爲餓漢模式
,因爲他總是在類剛剛加載的時候即創建實例對象。還用一種單例的實現方式被稱爲懶漢模式
,實現如下:
public class Singleton {
//懶漢
private static Singleton singleton =null;
private Singleton(){
System.out.println("生成唯一的實例");
}
public synchronized static Singleton getSingleton(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
可以看到,與餓漢模式
不同的是,懶漢模式
在最初是的時候僅僅創建一個null
的空引用,當首次調用getSingleton
的時候,由於singleton
的引用爲空,所以會創建一個新的實例對象。在後續調用的時候,都只返回這一個實例即可。