設計模式(1) 單例模式

2021-08-10 09:17:17 字數 1612 閱讀 9501

設計模式是一種經驗的總結,有經驗的物件導向設計者在不斷的開發試錯、總結中得到了一些面向不同場景不同需求的設計經驗,經過不斷的驗證,基於這些經驗的某種物件導向的設計風格被認為是某種意義上的最佳實踐。

當然是不是真的有最佳實踐這種東西呢,我個人覺得,在大部分時候,我們可以照搬某個基本的設計模式,應用到我們自己的專案中去,但是實際專案中,也會有很多問題,必須要根據實際的情況對這些模式進行一些變形。

所以原理和思想是重點,熟悉常用的設計模式有助於我們解決設計問題和提高**質量,最重要的是我們不用去試錯。學習設計模式是必要的,因為這讓我們站在巨人的肩膀上。

我們常用的設計模式之一是單例模式,也是設計模式中最特別和最易理解的一種設計模式。

單例模式生成且只生成乙個全域性物件,這種物件通常被其他不同的物件使用在不同的地方,使用乙個全域性物件的好處是保證狀態。事實上單例模式是可以被靜態函式和靜態成員替代的,只是我們從物件導向的角度來講,將這些方法和成員封閉起來是更好的設計。所以其實單例也是基於靜態成員和變數的。單例例項化後本身就成為乙個靜態指標指向的物件。

值得一提的是,為了確保只有乙個例項,讓類自身去維護這樣乙個靜態物件是最好的選擇,因為這意味著,我們可以像平常建立乙個物件乙個直接「建立」這樣乙個單例物件(實際上可能是獲取乙個已有的物件),這樣在使用上我們不會覺得和普通物件有太多區別,當然普通物件可能需要delete(誰建立,誰釋放),單例基本不需要(單例類內部new的空間,由單例類內部delete)。

將建構函式定義為protected,將例項指標_instance設為private,使用者就只能通過乙個getinstance方法得到單一例項,不管之前例項狀態如何,只要使用者需要,返回這一例項即可。

乙個基本的單例示例如上所示,對於了解單例的使用是足夠的,但是我們發現乙個問題,寫在上面示例的**注釋中。如果我們在類內部使用了new,那麼誰來負責釋放這一物件?根據誰建立誰釋放的原則,當然是這個單例類自身最好。所以我們在上面的示例中作一些修改:

在singleton內部定義乙個gc類專門用來負釋放singleton的例項物件記憶體,並且這個定義乙個gc物件在singleton內部,這樣程式退出時,這個gc會被釋放,從而呼叫他的析構函式執行釋放singleton例項記憶體的功能,將他們申明為private是防止被外部物件濫用。

class singleton}};

static gc gc;//程式退出時,釋放這個靜態物件,然後執行記憶體釋放

}

乙個遊戲的主角可能只有乙個,那麼當然可以使用單例模式。或者乙個工廠(factory模式)例項只需要乙個,也可以使用單例模式。

單例模式有一些變形,比如多例模式,但基礎是單例模式。單例模式由於是全域性物件,在多執行緒環境下,應尤其注意,如果有必要的話可以根據多執行緒程式設計的加鎖方法在單例類中實現加鎖防止競爭出錯。

設計模式1 單例模式

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

設計模式1 單例模式

單例模式,利用工廠類只生產乙個例項或者有限個例項,比如乙個系統中只有乙個主機板,乙個顯示卡,但是有些系統中也可以存在多個,雙顯示卡,雙顯示器等等。這些在singleton module中都是可以定義的。當然我們也可以使用全域性的變數或者靜態類或者物件去做,但是單例模式的存在是有其優點的。public...

設計模式1 單例模式

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