單實例模式
阿新 • • 發佈:2017-06-03
更改 土豪 懶漢 邏輯錯誤 排隊 創建 控制 判斷 提高
前言:
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中(jvm)一個類只有一個實例。即一個類只有一個對象實例;這幾種模式有幾種好處:
1.可以避免實例存在多個引起程序的邏輯錯誤(比如一個國家有多個主席,肯定會一團糟)
2.某些創建頻繁的類,使用單列模式可以減輕內存的壓力
3.因為類控制了實例化過程,所以類可以靈活更改實例化過程。
單列模式的三種模式:
1.餓漢模式
//餓漢式--典型的窮屌絲,吃了上頓沒下頓。所以要提前準備(類加載就給準備好 ) public class Singleton {//在自己內部定義自己的一個實例,只供內部調用 private static Singleton singleton=new Singleton(); private Singleton(){} //這裏提供了一個供外部訪問本class的靜態方法,可以直接訪問 public static Singleton getSingleton(){ return singleton; } }
這種模式雖然好用,也是線程安全的,但如果多了,嚴重影響性能。
2.飽漢式(也叫懶漢式)
//飽漢式--典型土豪,吃飽了撐著;餓的時候才臨時叫人準備(創建實例)public class Singleton { private static Singleton singleton=null; private Singleton(){} public static synchronized Singleton getSingleton(){ if (singleton==null) { singleton=new Singleton(); } return singleton; } }
這種模式用的比較多,但如果這個類並發使用率高的時候,就影響性能了。
3.雙重鎖模式
//飽漢模式的雙重鎖模式,提高效率 public class Singleton { private static Singleton singleton = null; private Singleton() { } public static Singleton getSingleton() { //只有對象為null的時候才要排隊 if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
飽漢模式的優化,進行雙重判斷,當已經創建過實例對象後就無需加鎖,提高效率。也是一種推薦使用的方式。
單實例模式