[程式示範]
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
在執行第一個 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是等你要用時才會產生,可以延遲初始化的時間,畢竟不是所有的變數一啟動就會使用到
有興趣就快去試看看吧!!!
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是等你要用時才會產生,可以延遲初始化的時間,畢竟不是所有的變數一啟動就會使用到
有興趣就快去試看看吧!!!
沒有留言:
張貼留言