1. 程式人生 > >Java設計模式學習筆記(單例模式)

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的,跟一遍程式碼邏輯,理解更深。