C 常用的設計模式之單例模式

2021-08-26 08:09:46 字數 1734 閱讀 6185

最近在看設計模式,同時在學習過程中也檢視了大量的部落格,也查閱了很多關於設計模式的一些文章的,在此,特別記錄下我的學習筆記,加深自己對設計模式理解,同時可以給一些初學設計模式的朋友提供查閱的路徑。

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項。單例模式常用 singleton 表示,singleton 在數學與邏輯學中定義為「有且僅有乙個元素的集合」。

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪乙個才是真實的狀態。因此有時確保系統中某個物件的唯一性即乙個類只能有乙個例項非常重要。

從單例模式的概念入手,一:確保乙個類只有乙個例項;二:只有乙個全域性訪問點,下面就開始實現**編寫:

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()

return uniqueinstance;

}}

單例模式在單執行緒執行下是完美的,但是在多執行緒下會得到多個singleton例項,因為兩個執行緒同時執行getinstance方法,對多執行緒的解決方案自然就是使getinstance方法在同一時間只執行乙個執行緒執行就好了,這裡,引入執行緒鎖機制:

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()

}

return uniqueinstance;

}}

上面這種解決方案確實可以解決多執行緒的問題,但是上面**對於每個執行緒都會對執行緒輔助物件locker加鎖之後再判斷例項是否存在,對於這個操作完全沒有必要的,因為當第乙個執行緒建立了該類的例項之後,後面的執行緒此時只需要直接判斷(uniqueinstance==null)為假,此時完全沒必要對執行緒輔助物件加鎖之後再去判斷,所以上面的實現方式增加了額外的開銷,損失了效能,為了改進上面實現方式的缺陷,我們只需要在lock語句前面加一句(uniqueinstance==null)的判斷就可以避免鎖所增加的額外開銷,這種實現方式我們就叫它 「雙重鎖機制」,下面具體看看實現**的:

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()}}

return uniqueinstance;

}}

到此,設計模式的單例模式介紹完了,希望大家可以對單例模式有乙個更深的理解,並且希望之前沒接觸過單例模式或覺得單例模式陌生的朋友看完之後或有所感悟

C 常用設計模式之 單例模式

單例模式沒啥好說解說的,這個模式太經典了,以至於即使你沒有接觸過設計模式也一定聽過單例模式的大名。網上關於單例模式的例子有很多,這裡就算做乙個歸納總結吧!單例模式的定義 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。uml結構圖如下 網路上常見的單例模式實現,有以下幾種 類的宣告 clas...

常用設計模式之 單例模式

概念 從字面意思不難理解,單例模式就是指某個類僅能建立乙個例項。實現 實現單例模式常有兩個誤區 一 看見單例時,最容易聯想到的就是把乙個類的所有屬性以及方法均設為靜態的。初聽上去,這種方法是挺不錯的,但靜態屬性 方法是在類載入時就初始化了,得到自己的空間,這不是我們能夠控制的,當我們程式中有大量這種...

C 設計模式之單例模式

在遊戲開發過程中,我們時常會遇到單例模式的運用場景。比如你遊戲當中的最終boss,你希望你的boss只能有乙個,所以這裡你就可以用單例模式 那麼什麼是單例模式呢?看下面的 分析。include include using namespace std class singleton public st...