設計模式 建立型模式 單例模式

2021-10-18 16:24:47 字數 2151 閱讀 8802

亦稱: 單件模式、singleton

單例模式是一種建立型設計模式, 讓你能夠保證乙個類只有乙個例項, 並提供乙個訪問該例項的全域性節點。

單例模式同時解決了兩個問題, 所以違反了_單一職責原則_:

1. 保證乙個類只有乙個例項

2. 為該例項提供乙個全域性訪問節點

所有單例的實現都包含以下兩個相同的步驟:

如果你的**能夠訪問單例類, 那它就能呼叫單例類的靜態方法。 無論何時呼叫該方法, 它總是會返回相同的物件。

如果程式中的某個類對於所有客戶端只有乙個可用的例項, 可以使用單例模式。

單例模式禁止通過除特殊構建方法以外的任何方式來建立自身類的物件。 該方法可以建立乙個新物件, 但如果該物件已經被建立, 則返回已有的物件。

如果你需要更加嚴格地控制全域性變數, 可以使用單例模式。

單例模式與全域性變數不同, 它保證類只存在乙個例項。 除了單例類自己以外, 無法通過任何方式替換快取的例項。

請注意, 你可以隨時調整限制並設定生成單例例項的數量, 只需修改獲取例項方法, 即 getinstance 中的**即可實現。

在類中新增乙個私有靜態成員變數用於儲存單例例項。

宣告乙個公有靜態構建方法用於獲取單例例項。

在靜態方法中實現"延遲初始化"。 該方法會在首次被呼叫時建立乙個新物件, 並將其儲存在靜態成員變數中。 此後該方法每次被呼叫時都返回該例項。

將類的建構函式設為私有。 類的靜態方法仍能呼叫建構函式, 但是其他物件不能呼叫。

檢查客戶端**, 將對單例的建構函式的呼叫替換為對其靜態構建方法的呼叫。

舉例實現–懶漢模式(加鎖判斷)

定義乙個用於儲存靜態變數的例項

//建構函式

;//預設拷貝構造

//析構函式};

結果

0x2216e70

0x2216e70

//相同的位址

舉例實現–餓漢模式(初始化時候構造)

定義乙個用於儲存靜態變數的例項

//建構函式

;//預設拷貝構造

//析構函式};

}結果

singleton works, both variables contain the same instance.

設計模式 建立型模式 單例模式

類載入時建立物件 常量 class eagersingleton public static eagersingleton getinstance 延遲載入 假如在某一瞬間 執行緒a 和 執行緒b 都在呼叫getinstance 方法,此時instance物件為null值,均能通過instance ...

設計模式建立型模式 單例模式

單例模式 singletonparrten 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點 建立單例模式需要三方面操作 1.建立乙個物件 2.定義乙個私有構造方法 禁止外部類對其進行例項化 3.提供乙個對外訪問的方法 單例模式可以通過懶漢式和餓漢式來實現。懶漢式 執行緒不安全 懶漢式 單例模...

設計模式 建立型模式 單例模式

優點 缺點頻繁使用 建立與銷毀 資源占用較多,例項化消耗大且耗時長,通過共享單例,加快物件的訪問速度 類要求只生成乙個例項的場景 需要單一控制邏輯的操作。具體如 多執行緒執行緒池 網路連線池 訪問資料庫或者檔案的物件等等。結構主要角色 實現 懶漢式實現 實現特點 該模式的特點是類載入時沒有生成單例,...