設計模式(四) 單例模式 c 實現

2021-08-19 18:45:30 字數 1447 閱讀 8839

單例模式(singleton),也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

1>只能例項化乙個物件

2>建構函式私有化,這樣在類外就不能另外new物件

2>多執行緒的時候注意加鎖

優點:.

1>由於在系統記憶體中只存在乙個物件,因此可以 節約系統資源,當需要頻繁建立和銷毀的物件時單例模式無疑可以提高系統的效能。

2>避免對共享資源的多重占用.

缺點:

1>不適用於變化的物件,如果同一型別的物件總是要在不同的用例場景發生變化,單例就會引起資料的錯誤,不能儲存彼此的狀態。

2>由於單利模式中沒有抽象層,因此單例類的擴充套件有很大的困難。

**實現:

class csingleton  

static csingleton *m_pinstance;

public:

static csingleton * getinstance()

return m_pinstance;

} };

使用者訪問唯一例項的方法只有getinstance()成員函式。如果不通過這個函式,任何建立例項的嘗試都將失敗,因為類的建構函式是私有的。也就是說getinstance的返回值是當這個函式首次被訪問時被建立的。這是一種防彈設計——所有getinstance()之後的呼叫都返回相同例項的指標

上訴**在多執行緒的環境下卻不行了,因為很可能兩個執行緒同時執行到if (m_pinstance == null)這一句,導致可能會產生兩個例項。於是就要在**中加鎖。

static csingleton * getinstance()  

unlock();

return m_pinstance;

}

但這樣寫的話,有經驗的人一眼就看出,這樣會對效能有很大的影響,因為每次判斷是否為空都需要被鎖定,如果有很多執行緒的話,就愛會造成大量執行緒的阻塞。於是又有一種寫法叫雙重鎖定。

static csingleton * getinstance()

unlock();

}return m_pinstance ;

}

這樣只夠極低的機率下,通過越過了if (m_pinstance == null)的執行緒才會有進入鎖定臨界區的可能性,這種機率還是比較低的,不會阻塞太多的執行緒,但為了防止乙個執行緒進入臨界區建立例項,另外的執行緒也進去臨界區建立例項,又加上了一道防禦if (m_pinstance == null),這樣就確保不會重複建立了。

設計模式 C 實現單例模式

class singleton singleton singleton sing null singleton singleton getinstance 單例模式的實現要點 1 首先要將類的建構函式 複製建構函式和過載的賦值操作符設定為私有方法private,這樣禁止使用者呼叫建構函式來建立物件,...

設計模式 單例模式 C 實現

定義 指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。特點 1.單例類只有乙個例項物件 2.該單例物件必須由單例類自行建立 3.單例類對外提供乙個訪問該單例類的全域性訪問點。結構 單例類的建構函式往往是私有的。第一種 懶漢式單例 這種模式特點是類載入時沒有生成單例,只有當第一次呼叫geti...

設計模式 四 單例模式

singleton pattern 單例模式 singleton pattern 確保某乙個類只有乙個例項,向整個系統提供這個唯一例項,這個類稱為單例類,它提供全域性訪問的方法。單例模式是一種物件建立型模式。單例模式是結構最簡單的設計模式一,在它的核心結構中只包含乙個被稱為單例類的特殊類。單例模式的...