借鑑了劍指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 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出...