靜態類和單例模式區別

2021-09-24 20:01:31 字數 2496 閱讀 2578

觀點一:(單例)

單例模式比靜態方法有很多優勢:

首先,單例可以繼承類,實現介面,而靜態類不能(可以整合類,但不能整合例項成員);

其次,單例可以被延遲初始化,靜態類一般在第一次載入是初始化;

再次,單例類可以被整合,他的方法可以被覆寫;

最後,或許最重要的是,單例類可以被用於多型而無需強迫使用者只假定唯一的例項。舉個例子,你可能在開始時只寫乙個配置,但是以後你可能需要支援超過乙個配置集,或者可能需要允許使用者從外部從外部檔案中載入乙個配置物件,或者編寫自己的。你的**不需要關注全域性的狀態,因此你的**會更加靈活。

觀點二:(靜態方法)靜態方法中產生的物件,會隨著靜態方法執行完畢而釋放掉,而且執行類中的靜態方法時,不會例項化靜態方法所在的類。如果是用singleton, 產生的那乙個唯一的例項,會一直在記憶體中,不會被gc清除的(原因是靜態的屬性變數不會被gc清除),除非整個jvm退出了。這個問題我之前也想幾天,並且自己寫**來做了個實驗。

觀點三:(good!)

由於dao的初始化,會比較佔系統資源的,如果用靜態方法來取,會不斷地初始化和釋放,所以我個人認為如果不存在比較複雜的事務管理,用singleton會比較好。個人意見,歡迎各位高手指正。

這裡暫且把單例模式限定為不是全用靜態函式實現的。

1。使用的方便性:如果需要初始化工作,單例模式可以在建構函式裡面完成,全靜態函式的類需要乙個額外的函式來完成初始化工作,而且使用者如果沒有呼叫這個initialize函式,那麼後續的操作就會有問題,建構函式會被預設呼叫,所以使用起來比較簡單,對使用者做出了最少的假設。

2。初始化時機:單例模式初始化比較靈活,可以在需要的時候初始化,而全靜態函式必然導致成員全為靜態成員,靜態成員是在編譯時就初始化好了。如果初始化成本比較昂貴,並且程式裡面未必一定使用這個類,那這將是單例模式的乙個很大優勢。順便說一下全域性變數,全域性變數的初始化順序是未指定的。

例如 全域性變數int a; int b;編譯器是先初始化a還是先初始化b?我想大家只能靠猜,或者在某個編譯器上實驗一下給出答案,一旦要是有個新編譯器,結果又會是什麼樣子呢?

3。最重要的區別:單例模式可以有多型,而全靜態的類不能支援多型。

資料庫操作類不宜使用singleton模式

不要將資料庫連線做成單例,因為乙個系統可能會與資料庫有多個連線,並且在有連線池的情況下,應當盡可能及時釋放連線。singleton模式由於使用靜態成員儲存類例項,所以可能會造成資源無法及時釋放,帶來問題。

做專案做的多了,所以考慮問題的方向也不一樣了。以前剛開始只是以實現功能為目的,美觀、實現方式、**邏輯、執行效率等等,幾乎不考慮。

然而要想成為合格的軟體設計師,軟體的設計就必須全面周到,不僅僅只是考慮如何開發,更多的要考慮軟體的發展和維護。

所以平時的學習中多思考多理解是非常重要的。

在學習drp中,我們都知道王勇把業務邏輯層(manager、servlet)都幾乎做成的單例模式。我當時就思考為何他要這麼做呢?

漸漸的我明白了,而且是切身的理解了。

在用.net開發web專案的時,在ui層我們要例項化bll層的類,然而正因為是web開發,如果按照咱原來的寫法(如下)

protected void page_load(object sender, eventargs e)

}那麼客戶端只要與伺服器需要互動一次就要執行一次page_load事件【因為與伺服器互動後客戶端瀏覽器會重新整理頁面】,那麼就要例項化一次newsmanager(),這還僅僅是page_load的事件,往往還會有別的事件,比如按鈕單擊事件,因為ui層與bll層的互動是非常平凡的。

試想下這麼多次重複的new的次數,是多麼的浪費資源啊,即便把newsmanager設定成該頁面的全域性變數,還是免不了每重新整理一次就例項化一次的弊端。

所以把bll層的類做成單例模式是出於對伺服器資源優化的乙個應用。

關於單例模式的應用,我目前了解到的有:配置檔案、開啟視窗、工廠模式的工廠類、再有就是今天說的bll層管理類。

如果各位還有對於單例模式應用和技巧的見解還請多多請教

bo層為什麼設計為單例模式?

1、首先要理解每乙個bo例項是用來處理使用者的一類請求操作的,即然是用來處理一類操作,那麼所有的操作都可以用乙個例項來完成即單例,只要不存在例項變數,那麼就不會發生執行緒安全的問題。此時如果設計為多例的,並且不存在例項變數的情況,那麼新例項和舊例項是沒有任何區別的,都是執行同一類操作,處理使用者的同一類請求。那麼這時多例項只會占用更多的記憶體空間,沒有任何益處。

總結:業務層是用來處理使用者的業務邏輯操作的,概念上講業務層的對像應該設計為只存在操作方法,而不應該有例項變數的情況會更加符合業務層處理業務操作的概念。單例強呀!

如果你只是想使用一些工具方法,那麼最好用靜態類,靜態模擬單例類更快,因為靜態的繫結是在編譯期進行的。***如果你要維護狀態資訊,或者訪問資源時,應該選用單例模式。***還可以這樣說,當你需要物件導向的能力時(比如繼承、多型)時,選用單例類,當你僅僅是提供一些方法時選用靜態類。

附個單例**

public class singleton

public static singleton instance

}}

靜態類和單例模式區別

單例模式限定為不是全用靜態函式實現的。1。使用的方便性 如果需要初始化工作,單例模式可以在建構函式裡面完成,全靜態函式的類需要乙個額外的函式來完成初始化工作,而且使用者如果沒有呼叫這個initialize函式,那麼後續的操作就會有問題,建構函式會被預設呼叫,所以使用起來比較簡單,對使用者做出了最少的...

單例模式和靜態類的區別

1.首先明確一下,靜態成員並不是什麼程式載入時建立並初始化的,而是類載入時進行。類的載入是第一次真正用到它的時候 拿類new例項或呼叫它的靜態方法 進行的,而這個載入過程需要將 class 檔案中構成類的靜態和例項方法等類的成員的位元組碼指令一同載入到記憶體中,而後要為靜態域分配儲存空間並使用靜態塊...

靜態類 VS 單例模式

假定將單例模式限定為不是全用靜態函式實現。1 使用的方便性 如果需要初始化工作,單例模式可以在建構函式裡面完成,全靜態函式的類需要乙個額外的函式來完成初始化工作,而且使用者如果沒有呼叫 initialize 函式,那麼後續的操作就會有問題。而建構函式會被預設呼叫,所以使用起來比較簡單,對使用者做出了...