c 單列模式

2021-09-24 20:51:29 字數 1654 閱讀 4619

借鑑了劍指offer書上寫的和乙個部落格:c++單例模式。自己做乙個簡單的總結。

只能有乙個例項化的物件的類。那麼如何做到只有乙個例項化物件呢?

建構函式一般定義在public之中,你也可以定義在protected和private之中,這樣的話就沒有辦法進行外部例項化。有的時候, 會要求禁止使用者建立類的例項就會這麼用的。

建構函式不能從外部呼叫 --->  建構函式為私有或保護專門設定乙個介面供外部呼叫,但是多次呼叫的返回值必須是同乙個物件 --->靜態物件,同時介面必須是靜態成員函式

class csingleton 

static csingleton* p;

public:

static csingleton* getinstance()

return p;

}};csingleton* csingleton::p = null;

注意點:

if(p==null)    return new csingleton();//錯誤
不過上面這個也只是乙個單執行緒下沒問題的單列模式,如果是多執行緒環境下,多個執行緒同時建立singleton物件,並且指標為null呢?那不是發生了錯誤嗎?所以要對臨界區進行保護,加鎖。

//多執行緒下的單列模式--->僅僅多了加鎖

class singleton_pthread

static singleton_pthread* p;

static pthread_mutex_t mtx;

public:

static singleton_pthread* getinstance()

return p;

}};singleton_pthread* singleton_pthread::p = null;

pthread_mutex_t singleton_pthread::mtx = pthread_mutex_initializer;

/*pthread_mutex_initializer 用在靜態型別的互斥量中,

而且應該在互斥量定義的時候就用 pthread_mutex_initializer 進行初始化,

否則用 pthread_mutex_init 進行初始化。

pthread_mutex_t mutex;

pthread_mutex_init(&mutex,null); //null為預設的互斥鎖

*/

其實加鎖是耗時的操作,但是這個....感覺寫到這面試差不多了。不過上述兩種單執行緒、多執行緒的單列模式都是屬於懶漢模式——就是有需要的時候才建立,比如我們一開始都只是把物件指標初始化null,如果採用餓漢模式——直接在指標初始化的時候就創造乙個例項化物件。而且直接建立出來了就不存在資源搶奪,也就不用加鎖了。

class singleton

static singleton* p;

public:

singleton* getinstance()

}singleton* singleton::p = new singleton();//p是csingleton的成員,它是可以呼叫建構函式的

C 單列模式

在 design patterns elements of resuable object oriented software 中的定義是 ensure a class only has one instance,and provide a global point of access to。它的主...

C 設計模式 單列模式

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

python單列模式 Python單列模式

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