Java設計模式學習筆記(單例模式)
最近一直在看《Head First設計模式》,這本書寫的確實是很不錯的,專注於怎麼用最簡單的方式最通俗的語言讓人瞭解設計模式。據說GoF的設計模式那本書寫的很好,是一本經典,但是就是難懂,這本書應該就是我們這些一看經典書就困的人的寶貝了。
不過Head First系列並不專注於寫程式碼,我就把自己學習的時候寫出來的程式碼貼在這裡當做筆記吧,也方便搜到的人蔘考。
單例模式是我遇到的最多的模式了,這種模式大部分被利用在資料庫程式設計中,因為涉及到資源分配等原因,單例模式是一種非常好的模式。
下面是一段我實現的單例模式程式碼,也是我們現在工程裡在用的,我就不打算寫什麼懶漢式啊,餓漢式啊的了。
package pattern;
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
下面的程式碼是它的測試程式碼:
package pattern;
public class SingletonTest {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
String str = instance.toString();
System.out.println(str);
}
}
其實以前我很不理解單例模式為什麼叫做單例,為什麼這個類只會有一個例項存在。如果我在測試程式碼裡宣告兩個變數如何呢?
結果後來我debug了一次程式碼,我才知道了什麼叫做只有一個例項。那麼測試程式碼改一下:
package pattern;
public class SingletonTest {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
String str = instance.toString();
String str1 = instance1.toString();
System.out.println(str);
System.out.println(str1);
}
}
打印出來的結果是一樣的。
debug的時候我發現這一句(Singleton instance1 = Singleton.getInstance();)的執行會在if (instance == null)這裡返回false,因此是不會重新new一個物件的,因此instance和instance1引用的其實是一個物件,這就是單例模式了。
現在發現學習寫程式碼還是一定要debug的,跟一遍程式碼邏輯,理解更深。