JAVA設計模式-Singleton

近來一直在研究JAVA的設計模式,看了很多別人的文章和源碼,自己也寫了一些,算是有一些認識吧,我想要把這些想法都記錄下來。23個設計模式算很多了,希望我能有時間,也有毅力能夠堅持下來。下面就是第一個設計模式,Singleton。

 

      這個模式限制了使用這個模式的類只能生成一個對象。有一些對象其實我們完全只需要一個即可,如:線程池(threadpool)、緩存(cache)、註冊表(registry)的對象、設備的驅動程序的對象等等。事實上,這些類的對象只能有一個實例,如果製造出多個實例,就會導致許多問題的產生,例如:程序的行爲異常、資源的過量使用、產生不一致的結果等等。Java Singleton模式就爲我們提供了這樣實現的可能。是用Singleton的好處還在於可以節省內存,因爲它限制了實例的個數,有利於Java垃圾回收(garbage collection)。

 

     下面我就用代碼來實現一個Singleton模式,當然這只是其中一種實現方法而已。

 

 

 

   

 

    然後是測試代碼:

   

 

 

    上面的代碼的打印結果是true,證明了singleton1和singleton2指向了同一個對象。

 

    這裏我想要提一下這個equals()方法,這個方法是沒有被重載過的方法,因此,這個equals()方法比較的是兩個對象的引用,引用這個詞語類似於c/c++裏的指針,所以說,equals()方法返回true,就意味着這是同一個對象。

 

    另外,我想提一下static這個關鍵字,它是Singleton模式的核心。

    1.Singleton類的成員變量instance被聲明爲staitc就意味着這個成員變量只有一份(而不是每個對象一份)。

    2.getInstance()這個方法是static的就是說,這個方法在Singleton這個類沒有被實例化的時候就能使用。

    3.當Singleton這個類被加載的時候(是執行singleton1 = Singleton.getInstance();這句話的時候,注意不是這句話Singleton singleton1; ),這個類的靜態成員變量instance被初始化(private static Singleton instance = new Singleton(); 這句話被執行),然後(注意是先初始化,再調用)調用getInstance()方法返回這個成員變量instance,當執行singleton2 = Singleton.getInstance();這句話的時候,因爲instance被聲明成static,因此,private static Singleton instance = new Singleton(); 不會被(注意是不會被)再次調用,而是直接調用getInstance()方法,返回同一個instance。這樣就實現了Singleton這個模式。

 

 

    下面是一些擴展,既然我們能夠限制類只能生成一個對象,那麼就能限制它最多生成指定數量個對象,代碼如下:

 

   

 

    這個類只能生成10個對象,就不解釋了,你們懂的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章