設計模式第六天之單例模式

2021-07-24 18:07:46 字數 2864 閱讀 2835

這次和大家分享一下設計模式中的單例模式。

說到單例模式,我相信大家都了解,簡單說就是某個類在整個程式中只有乙個物件。那為什麼使用單例模式呢?什麼場景使用單例模式呢?

我個人認為,在程式設計中,經過分析,某個類有乙個物件已經可以滿足要求,如果此時再加上這個類會消耗許多資源(包括記憶體開銷大,建立物件耗時等),這個類就推薦使用單例來實現了。比如:資料庫連線及相關操作,載入,快取,執行緒池等等。使用單例模式也可以更好的實現共享資源。

那如何實現單例模式呢?在這裡我和大家分享五種方式。在這五種方式中,都是以乙個簡單的計算器例子來說明,計算加減乘除的類物件明顯在程式中只要有乙個就可以了。在這裡只是為了介紹這些方式實現。

1.      餓漢模式

/**

* 餓漢模式實現單例模式

* 好處:簡單

* 缺點:

* 當類載入的時候就建立了物件而不管物件時候在使用

* 造成資源的浪費

* 當記憶體不足的時候,**了靜態物件,此時訪問也會帶來bug

* @author wangpeiyu

* */

public class hungry

public hungry getinstance()

public int add(int a,int b)

public int sub(int a,int b)

public int mul(int a, int b)

public float div(int a,int b)

}

2.      懶漢模式

/**

* 懶漢實現單例模式

* 好處:解決了執行緒安全,也做到了要使用的時候才建立物件

* 缺點:每次要獲取該物件的時候,都要進行執行緒同步,即使在instance已經賦值了之後

* 還要進行執行緒同步,這就造成了不必要的時間浪費和資源浪費

* @author wangpeiyu

* */

public class lazy

public synchronized static lazy getinstance()

return instance;

} public int add(int a,int b)

public int sub(int a,int b)

public int mul(int a, int b)

public float div(int a,int b)

}

3.      靜態內部類方式

/**

* 靜態內部類實現單例模式

* 好處:執行緒安全、也達到了延遲載入、當載入單例類的時候並沒有建立物件。

* 缺點:記憶體不足,**靜態物件時,在訪問會出現bug

* 無法解決發序列化導致的物件重建

* @author wangpeiyu

* */

public class staticinclass

public static staticinclass getinstance()

/*** 靜態內部類

* 主要的單例類的holder

* @author wangpeiyu

* */

private static final class singletonholder

public int add(int a,int b)

public int sub(int a,int b)

public int mul(int a, int b)

public float div(int a,int b)

}

4.      雙重檢查加鎖方式

/**

* 雙重檢查加鎖模式實現單例模式

* 好處:延遲了載入、執行緒安全,而且也避免了在instance已經賦值的情況下,多執行緒還要

* 同步造成的資源浪費和無意義的等待

* 缺點:當反序列化時無法避免會重新建立物件的問題

* @author wangpeiyu

* */

public class dcl

public static dcl getinstance()

}} return instance;

} public int add(int a,int b)

public int sub(int a,int b)

public int mul(int a, int b)

public float div(int a,int b)

}

5.      列舉方法

/**

* 使用列舉實現單例

* 好處:

* 1.完全確保整個程式只有乙個例項

* 2.執行緒安全,因為列舉一旦定義結束,編譯器就不允許我們再使用其構造器來建立任何例項了

* 3.建構函式是private的,即使定義為public,一樣為private

* 4.自由序列化,這樣即使在反序列化時也不會重新建立

* @author wangpeiyu

* */

public enum enumcaculate

public int add(int a,int b)

public int sub(int a,int b)

public int mul(int a, int b)

public float div(int a,int b)

}

在這五種實現中,我個人比較推薦列舉實現和雙重檢查加鎖實現。原因在每個類的**中體現了。

Javascript設計模式之單例模式(六)

簡單描述,就是只允許被建立一次的例項化物件。也可以被叫做為單體模式。一般在當做命名空間上使用。事實上被當做命名空間,我們熟悉的jquery就是這種方式,外部只需要通過這個物件,便可以使用內部的方法與屬性 let a ajax function 我們 引用的時候只需要使用命名空間a就可以了 a.ext...

(六)設計模式 單例模式

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。注意 head first 中提到單例模式的時候,類建構函式為私有 private 通過靜態方法建立例項。剛解放時,國家需要人,人多力量大,於是乙個老百姓可能生了很多娃,於是人口迅速暴增。後來實行了計畫生育,規定了一對夫婦最多只能生育一胎,並把...

設計模式第六講 單例模式(附優化方案)

乙個類有且僅有乙個例項,並且自行例項化向整個系統提供。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。希望在系統中某個類的物件只能存在乙個。單例模式有兩種寫法 1.懶漢式 2.餓漢式 懶漢式實現 public class single pu...