c 設計模式之單例模式

2021-08-03 19:48:41 字數 1911 閱讀 7403

單例模式概念

單例模式事比較常用的設計模式之一。一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多的跟自身有關的資料,在這種情況下,每次都去new乙個物件,即增加了開銷,也使得**更加臃腫。其實,我們只需要乙個例項物件就可以。如果採用全域性或者靜態變數的方式,會影響封裝性,難以保證別的**不會對全域性變數造成影響,而且這樣的**顯的很不優雅。 使用全域性物件能夠保證方便地訪問例項,但是不能保證只宣告乙個物件——也就是說除了乙個全域性例項外,仍然能建立相同類的本地例項。

我們將預設的建構函式宣告為私有的,這樣就不會被外部所new了,甚至可以將析構函式也宣告為私有的,這樣就只有自己能夠刪除自己了。

單例模式的懶漢模式和餓漢模式

懶漢模式:就是不到萬不得已是不會去例項化類的,也就是說在第一次用到類例項的時候才會去例項化。

餓漢模式:在單例類定義的時候就例項化了。

優點和缺點:

(1)在訪問量比較小的時候,採用懶漢模式。以時間換空間。

(2)因為要進行執行緒同步,所以在訪問量較多的時候,採用餓漢模式,可以實現更好的效能。以空間換時間。

實現:把建構函式定義為私有的或者保護的,再定義乙個類的私有的靜態指標,指向這個類的唯一例項,再提供乙個公有的靜態的方法獲取該例項。

**實現

《一》餓漢模式

(1)餓漢模式實現一

class siglenton      //懶漢模式(執行緒不安全)

return ptr;

}private:

siglenton()

;siglenton *siglenton::ptr = null;

int main()

該方式實現的單例模式是不安全的,假如有兩個執行緒同時呼叫getinstance的時候,同時檢測到ptr指標為空,同時建立乙個相同的物件,這是錯誤的。

(2)餓漢模式實現二(加一層互斥鎖)

class sigleton     

pthread_mutex_unlock(&mutex);

return ptr;

}private:

sigleton()

;sigleton *sigleton::ptr = null;

該方式加了一對互斥鎖,執行緒是安全的,但是對於單執行緒來說,每次都要加鎖解鎖,效率不高。而且如果每次判斷是否為空都需要被鎖定,如果有很多執行緒的話,就會造成大量執行緒的阻塞。

(3)餓漢模式實現三(兩層互斥鎖)

class sigleton   //加雙重互斥鎖

pthread_mutex_unlock(&mutex);

return ptr;

}private:

sigleton()

;sigleton *sigleton::ptr = null;

(4)餓漢模式實現四(用乙個靜態內部變數實現懶漢模式)

在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。

class siglenton   

private:

siglenton()

;siglenton *siglenton::ptr = null;

《二》懶漢模式

在類外初始化指標的時候就建立乙個物件。懶漢模式是執行緒安全的,不用加互斥鎖,因為在當類定義的時候定義了乙個物件,對類進行了初始化。後面不管哪個執行緒呼叫instance函式,都只不過是返回了乙個物件的指標而已。

class sigleton

}private:

sigleton()

;sigleton *sigleton::ptr = new sigleton();

C 設計模式之單例模式

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

C 設計模式之單例模式

設計模式是以理論的高度,總結了開發過程中的一多種不同的方法,在各種設計模式中,它們都有著不同實現方式,所起的作用也不相同,我最近看了部分設計模式,主要是以我自己的理解來闡述對它們的看法。我們可以看到單例的大概實現是很簡單的。幾個需要注意的地方是 只有當我們的建構函式為私有時,此時,我們在類外部就不能...

C 設計模式之 單例模式

單例模式,故名思義,其意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有的程式模組共享.在很多地方要用到這種設計模式,如系統的日誌輸出,作業系統的視窗,乙個pc連乙個鍵盤等.單例模式有許多實現方法.第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項,需要加鎖...