C 單列模式

2021-07-07 02:13:17 字數 1729 閱讀 9446

在《design patterns:elements of resuable object-oriented software》中的定義是:ensure a class only has one instance,and provide a global point of access to。它的主要特點不是根據客戶程式呼叫生成乙個新的例項,而是控制某個型別的例項數量-唯一乙個。(《設計模式-基於c#的工程化實現及擴充套件》,王翔)。也就是說,單例模式就是保證在整個應用程式的生命週期中,在任何時刻,被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。

一、經典模式:

[csharp]view plain

copy

public

class

singleton  

public

static

singleton getinstance()  

return

instance;  

}  }  

解析如下:

1)首先,該singleton的建構函式必須是私有的,以保證客戶程式不會通過new()操作產生乙個例項,達到實現單例的目的;

2)因為靜態變數的生命週期跟整個應用程式的生命週期是一樣的,所以可以定義乙個私有的靜態全域性變數instance來儲存該類的唯一例項;

3)必須提供乙個全域性函式訪問獲得該例項,並且在該函式提供控制例項數量的功能,即通過if語句判斷instance是否已被例項化,如果沒有則可以同new()建立乙個例項;否則,直接向客戶返回乙個例項。

在這種經典模式下,沒有考慮執行緒併發獲取例項問題,即可能出現兩個執行緒同時獲取instance例項,且此時其為null時,就會出現兩個執行緒分別建立了instance,違反了單例規則。因此,需對上面**修改。

二、多執行緒下的單例模式

1、lazy模式

[csharp]view plain

copy

public

class

singleton  

public

static

singleton getinstance()  

}  }  return

instance;  

}  }  

上述**使用了雙重鎖方式較好地解決了多執行緒下的單例模式實現。先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,保證只有乙個執行緒可以訪問該語句塊,進而保證只建立了乙個例項。再看外層的if語句塊,這使得每個執行緒欲獲取例項時不必每次都得加鎖,因為只有例項為空時(即需要建立乙個例項),才需加鎖建立,若果已存在乙個例項,就直接返回該例項,節省了效能開銷。

2、餓漢模式

這種模式的特點是自己主動例項。

[csharp]view plain

copy

public

sealed

class

singleton  

public

static

singleton getinstance()  

}  

上面使用的readonly關鍵可以跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,並可以在執行時編譯。在這種模式下,無需自己解決執行緒安全性問題,clr會給我們解決。由此可以看到這個類被載入時,會自動例項化這個類,而不用在第一次呼叫getinstance()後才例項化出唯一的單例物件。

**:

c 單列模式

借鑑了劍指offer書上寫的和乙個部落格 c 單例模式。自己做乙個簡單的總結。只能有乙個例項化的物件的類。那麼如何做到只有乙個例項化物件呢?建構函式一般定義在public之中,你也可以定義在protected和private之中,這樣的話就沒有辦法進行外部例項化。有的時候,會要求禁止使用者建立類的例...

C 設計模式 單列模式

單例模式是設計模式中最簡單和最容易理解的模式,需要注意的地方只有乙個,第一次例項化的時候要確保是執行緒安全即可。第一種實現 多執行緒不安全單利 public class single public static single getinstance 第二種實現 多執行緒安全單利 每次要加鎖浪費資源 ...

python單列模式 Python單列模式

實現單例模式的幾種方式 1.使用模組 2.使用裝飾器 3.使用類 4.基於 new 方法實現 推薦使用,方便 5.基於metaclass方式實現 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出...