網頁

2016年5月31日 星期二

[Design Pattern] 單例模式 Singleton Pattern

今天我們來討論 單例模式 Singleton , 什麼是單例模式,單看名字大概可以猜出一二,單例模式是保證我們的Application執行中只有一個Object。


[程式示範]

public class MySingleton {
    // variable
    private static MySingleton mySingleton;

    // constructor
    private MySingleton() {
    }

    // static method
    public static MySingleton getInstance() {
        if (mySingleton == null) {
            mySingleton = new MySingleton();
        }
        return mySingleton;
    }
}

首先簡單介紹一下singleton的幾個特性

1. 建構子為私有的 (private)

這是避免使用 new 關鍵字建立物件,如果能使用 new 就不能確保只能有一個實體


2. 一個靜態(static)類別型態的變數

這是為了讓靜態變數能夠一直綁住物件,不讓Garbage Collection清除物件,使用靜態變數也能在靜態方法使用


3. 一個靜態(static) getInstance方法
為了能讓所的類別取的物件,使用靜態方法,在方法實作中,檢查類別變數是否已被 實體化,這樣才能確保都是同一樣物件


接下來我用想像的記憶體分佈圖來解釋Singleton的流程
(跪求可看stack、heap、method area的軟體!!!)

在主方法使用Singleton

public class TestSingleton {
    public static void main(String[] args){
        MySingleton singleton1 = MySingleton.getInstance();
        MySingleton singleton2 = MySingleton.getInstance();

        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

在執行第一個 singleton1時

1. 在Stack記憶體區中,有一個singleton1變數 內容值是null,Method Area記憶體區存放Class,Heap則按照Class生產出物件,目前沒有物件所以Heap是空的



2. 呼叫MySingleton類別中的getInstance()方法



3. 會先判斷MySingleton的靜態變數 mySingleton是不是null,此時是null,所以會執行if大括號下的程式碼 new 一個物件


4. 並且配置給MySingleton的靜態變數 mySingleton


5. MySingleton類別中的getInstance()方法結束,並回傳MySingleton物件



在執行第一個 singleton2時,也是相同的方式,但是因為MySingleton類別中的靜態變數mySingleton已經不是null,所以會直接回傳MySingleton物件



直接執行跑出來的結果:



此時你可能會想,單純使用static變數也能做到,為什麼要用singleton,在Java中,static變數會在application啟動時就初始化,但是singleton是等你要用時才會產生,可以延遲初始化的時間,畢竟不是所有的變數一啟動就會使用到

有興趣就快去試看看吧!!!

沒有留言:

張貼留言