JAVA-單例設計模式

目的:

單例模式主要是為了避免因為創建了多個實例造成資源的浪費,且多個實例由於多次調用容易導致結果出現錯誤,而使用單例模式能夠保證整個應用中有且只有一個實例。

單例模式的設計思想:

(1)不允許其他程序用new對象。

因為new就是開闢新的空間,在這裡更改數據只是更改的所創建的對象的數據,如果可以new的話,每一次new都產生一個對象,這樣肯定保證不了對象的唯一性。

(2)在該類中創建對象

因為不允許其他程序new對象,所以這裡的對象需要在本類中new出來

(3)對外提供一個可以讓其他程序獲取該對象的方法

因為對象是在本類中創建的,所以需要提供一個方法讓其它的類獲取這個對象。

將上述三步轉換成代碼描述是這樣的:

(1)私有化該類的構造函數


(2)通過new在本類中創建一個本類對象
(3)定義一個公有的方法,將在該類中所創建的對象返回

單例模式的寫法:

①懶漢式②餓漢式③雙重校驗鎖④靜態內部類⑤枚舉

1.單例模式的餓漢式:

創建:

<code>public class Singleton { private static Singleton instance=new Singleton(); private Singleton(){}; public static Singleton getInstance(){ return instance; } }/<code>

<code>訪問方式/<code>

優點:從它的實現中我們可以看到,這種方式的實現比較簡單,在類加載的時候就完成了實例化,避免了線程的同步問題。

缺點:由於在類加載的時候就實例化了,所以沒有達到Lazy Loading(懶加載)的效果,也就是說可能我沒有用到這個實例,但是它

也會加載,會造成內存的浪費(但是這個浪費可以忽略,所以這種方式也是推薦使用的)。

單例模式的餓漢式變換寫法:

<code>public class Singleton{ private static Singleton instance = null; static { instance = new Singleton(); } private Singleton() {}; public static Singleton getInstance() { return instance; } }/<code>

訪問方式:

<code>Singleton instance = Singleton.getInstance();/<code>

單例模式的懶漢式[線程不安全,不可用]

<code> public class Singleton { private static Singleton instance=null; private Singleton() {}; public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }/<code>

懶漢式線程安全的[線程安全,效率低不推薦使用]

<code> public class Singleton { private static Singleton instance=null; private Singleton() {}; public static synchronized Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }/<code>

內部類[推薦用]

<code>public class Singleton{ private Singleton() {}; private static class SingletonHolder{ private static Singleton instance=new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.instance; } }/<code>

訪問方式:

<code>/<code>

枚舉[極推薦使用]

<code> public enum SingletonEnum { instance; private SingletonEnum() {} public void method(){ } }/<code>

訪問方式

<code>/<code>


<code>對稱的美感/<code>