23種設計模式入門 單例模式

2022-07-08 01:45:09 字數 2482 閱讀 2619

單例模式:採用一定的方法,使得軟體執行中,對於某個類只能存在乙個例項物件,並且該類只能提供乙個取得例項的方法。

分類

實現思路:

想要實現單例,即不能讓外部隨意的去例項化物件。所以需要構造器私有

既然不允許外部去建立了,所以需要在類的內部建立物件

外部需要使用物件,所以需要對外提供乙個獲取例項的方法

根據物件建立的時機,可以分為餓漢式和懶漢式。餓漢式,即在類載入的時候立即建立例項,根據所學知識我們可以很快想到要使用static關鍵字將屬性和類相關聯。以下提供兩種書寫方式供參考。

特點

class singleton01

//內部建立物件

private final static singleton01 instance = new singleton01();

//提供給外部建立例項的靜態方法

public static singleton01 getinstance()

}

class singleton02

//內部建立物件

private static singleton02 instance;

static

//提供給外部建立例項的靜態方法

public static singleton02 getinstance()

}

這種方式和靜態常量的實現方式邏輯和優缺點是一樣的,只是寫法不同。

懶漢式,即在類載入時並不例項化物件,等到使用物件例項的時候才去例項化,也被稱為懶載入效果。這樣做的好處可以節約資源,減少浪費,只有需要的時候採取建立,不需要就不會例項化。

class singleton01

// 定義靜態變數,例項化留在獲取例項的getinstance方法,起到懶載入效果

private static singleton01 instance;

public static singleton01 getinstance()

return instance;

}}

問題:在多執行緒情況下,假設類還未第一次例項化,此時兩個程序同時執行到了if(instance==null),而未來得及往下執行時,此時兩者校驗都成立,都會執行例項化操作,將有可能出現建立多個例項的問題。

class singleton02

//使用synchronized關鍵字來實現執行緒安全

public static synchronized singleton02 getinstance()

return instance;

}}

這樣的方式可以起到執行緒安全的效果,但是每個執行緒都需要等待鎖,所以又會存在效率低的問題,於是有人想到了將鎖的範圍縮小到方法的內部,使用同步**塊的方式

這樣的方式好不好呢?先看**

class singleton03

public static singleton03 getinstance()

}return instance;

}}

這樣鎖的範圍是變小了,但是還會存在多個執行緒同時判斷到if (instance == null),即使在後面加上鎖,依舊會在後續建立例項,只是延遲了一點而已,所以這種寫法不可取

為了能夠實現懶載入的效果,同時兼顧效率,於是出現了這種寫法

class singleton01

//雙重檢查,解決執行緒同步問題,又保證效率

public static singleton01 getinstance()}}

return instance;

}}

使用雙重檢查,第一次檢查提公升效率,第二次檢查保證執行緒安全,簡直美滋滋

利用靜態內部類在被呼叫時才會載入,即存在懶載入效果,所以也可以這樣寫

class singleton02

/*靜態內部類在外部類裝載的時候不會馬上執行,起到懶載入作用。

類的靜態屬性只有在第一次使用的時候才會載入,jvm在類載入時是執行緒安全的

*/private static class singletoninstance

public static singleton02 getinstance()

}

列舉方式是最簡單的寫法,也是被很多人推崇的寫法

enum singleton03
簡單明瞭...

使用單例模式,可以使乙個類只存在乙個例項物件,從而節省了系統資源。

23種設計模式 單例模式

某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...

單例模式(23種設計模式)

單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...

23種設計模式 單例模式

單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...