設計模式1 單例模式

2021-07-02 15:49:58 字數 1791 閱讀 6971

單例模式,利用工廠類只生產乙個例項或者有限個例項,比如乙個系統中只有乙個主機板,乙個顯示卡,但是有些系統中也可以存在多個,雙顯示卡,雙顯示器等等。

這些在singleton module中都是可以定義的。當然我們也可以使用全域性的變數或者靜態類或者物件去做,但是單例模式的存在是有其優點的。

public class singletonfactory

public static singletonfactory getinstance()

return uniqueinstance;

}}

單例模式的設計範例:

1. 有乙個靜態的單例模式型別的例項,初始為null

public static singletonfactory uniqueinstance = null;

2. 注意其建構函式應該為私有的,如果為公有則在外面就可以通過new來建立物件了,否則只能在類的內部呼叫new singletonfactory()來建立物件,而這才是我們想要的。

3. 在getinstance函式中做乙個判斷,就可以讓這個類的例項唯一了。

但是這樣的做法在多執行緒中會有問題,因為程式是按時間片來執行,如果執行緒a正在執行

if (uniqueinstance == null)

因為是空,所以執行

uniqueinstance = new singletonfactory();
但是還沒有執行將要執行之時,時間片現在跳轉到執行緒b來執行

if (uniqueinstance == null)
同樣會執行

uniqueinstance = new singletonfactory();
結果就是,因為多執行緒的原因使其存在了2個例項。。。這並不是我們想要看到的。

那麼解決這個問題的辦法有多種,各有優缺點。

1. 鎖住那個uniqueinstance,比較消耗資源。

public static singletonfactory getinstance()

}return uniqueinstance;

}

2. 直接建立乙個,但是有可能程式從頭到尾都沒用到過。

public static singletonfactory uniqueinstance = new singletonfactory();
3. 雙重檢查加鎖法,這個是比較推薦的

首先要

public static volatile singletonfactory uniqueinstance = null;
或許我需要把static和volatile的區別開乙個微博說一說,不過雖然static是靜態的,雖然在全域性只有乙個例項,但是對於多執行緒來說有乙個問題,這個例項雖然在a執行緒中被賦值,但是b執行緒在使用它的時候並不能完全確認是a執行緒賦值之前還是a執行緒賦值之後。於是乎,我們這裡用到了volatile,這個關鍵字的好處是對這個關鍵字修飾的變數賦值會使所有使用到他的地方的值都發生改變。

其次

public static singletonfactory getinstance()}}

return uniqueinstance;

}

這樣做的好處是,因為我們知道lock是比較消耗資源的,以上的雙重檢查加鎖的話,可以保證lock的操作只執行了一次。

因此我們比較推崇這種寫法。

設計模式1 單例模式

文章引用出處 singleton模式是最簡單最常用的設計模式。1,定義 確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個該類。2,單例模式優點 1 單例模式在記憶體中只有乙個例項,減少了記憶體的開支。2 單例模式只生成乙個例項模式,減少了系統效能的開銷。如當乙個物件的產生需要比較多的系統資...

設計模式1 單例模式

保證乙個類只有乙個例項 即乙個物件,並且提供乙個訪問該例項的全域性訪問點 即類中有乙個公共的方法 方法的返回該類的物件。1.windows的任務管理器 無論開啟多少次都只能開啟乙個視窗 2.windows的 站 3.專案中的配置檔案 4.的計數器 5.日誌 6.連線池 8.spring的bean 預...

設計模式 單例模式 1

上三篇文章都是在講工廠模式,這篇就跟吉哥一起學習最常用的模式 單例模式。概念 在它的核心結構中只包含乙個被稱為單例的特殊類。分類 單例模式的形式也比較多,包涵以下8種 這裡是把懶漢和餓漢細分了 1 餓漢式 靜態常量 2 餓漢式 靜態 塊 3 懶漢式 不加鎖,執行緒不安全 4 懶漢式 同步方法,執行緒...