關於單例模式應用的一些思考

2021-10-02 13:10:13 字數 1639 閱讀 7023

文章**:

單利模式的優缺點和使用場景

單例模式(singleton),也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。

許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

乙個類能返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法,通常使用getinstance這個名 稱);當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用;同時我們 還將該類的建構函式定義為私有方法,這樣其他處的**就無法通過呼叫該類的建構函式來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項。

單例模式在多執行緒的 應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項, 這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。

優點:

缺點:單例模式只允許建立乙個物件,因此節省記憶體,加快物件訪問速度,因此物件需要被公用的場合適合使用,如多個模組使用同乙個資料來源連線物件等等。如:

以下都是單例模式的經典使用場景:

1.資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。 

2.控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。

應用場景舉例:

1.餓漢式:單例例項在類裝載時就構建,急切初始化。(預先載入法)

/**

* 餓漢式(推薦)**/

public class test

public static test instance = new test();

public test getinstance()

}

優點 缺點

2.懶漢式:單例例項在第一次被使用時構建,延遲初始化。

class test 

public static test instance = null;

public static test getinstance()

return instance;

}}

優點:

缺點:3.雙重檢測

class test 

public static test instance = null;

public static test getinstance() }}

return instance;

}}

優點

4.靜態內部類

class test 

private static class singletonhelp

public static test getinstance()

}

優點 缺點

總結:一般採用餓漢式,若對資源十分在意可以採用靜態內部類,不建議採用懶漢式及雙重檢測

關於單例模式的心結

今天重構公司的 看到有乙個單例的物件,在整個系統中到處都存在呼叫它的身影,因為我們這個專案會在應用伺服器 server 第一次啟動的時候載入資料庫中的 表 為什麼要先載入,因為這個專案採用的是c s模式,利用remoting進行通訊,在客戶端啟動的時候會多次獲取 表中的不同資料。複製 1 publi...

關於單元測試的一些思考

邏輯直接了當 盡量少的依賴 乾淨利落的抽象以及直截了當的控制語句 沒有改進的餘地 以上內容都提取自 整潔之道 總結下來就是 簡單,簡潔,簡短.那麼提高程式正確性最有效的方法是什麼呢?在我看來,最有效的方法莫過於對 反覆琢磨推敲,讓它變得簡單,直觀,直到你一眼就可以看得出它不可能有問題。談程式的正確性...

關於單例設計模式的總結

1 什麼是單例設計模式 單例設計模式就是解決乙個類在記憶體中只有乙個物件。想要保證物件唯一 1 為了避免其他程式過多的建立該類物件,選控制其他程式建立該類物件 2 為了讓其他程式可以訪問到該類物件,只好在本類中自定義乙個物件 3 為了方便其他程式對自定義物件訪問,可以對外提供一些訪問方式 2 單例設...