1. 程式人生 > >單實例模式

單實例模式

更改 土豪 懶漢 邏輯錯誤 排隊 創建 控制 判斷 提高

前言:

  單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中(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;

    }
}

飽漢模式的優化,進行雙重判斷,當已經創建過實例對象後就無需加鎖,提高效率。也是一種推薦使用的方式。


單實例模式