[設計模式] - No.8 Singleton模式
阿新 • • 發佈:2018-12-04
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
的引用為空,所以會建立一個新的例項物件。在後續呼叫的時候,都只返回這一個例項即可。