什麼是單例模式?
單例模式就是乙個類只能被例項化一次,即只有乙個例項化的物件的類。
建立乙個單例模式的類
乙個類只能由乙個例項化的物件,即這個類就要禁止被new出來,或者通過直接定義乙個物件出來。
class car
~car(){}
};car a;
car *b = new car;
上面**很明顯可以被以兩種方法例項化出來,所以怎樣可以禁止式用上述兩種方法例項化乙個類?
可以看出,這兩種例項化類的方法都會呼叫建構函式,那麼我們是不是可以不讓建構函式在外部使用?
class singleton
//把複製建構函式和=操作符也設為私有,防止被複製
singleton(const singleton&);
singleton& operator=(const singleton&);
};int main()
通過上面的**,可以看出,當建構函式被設定為私有的後,這兩種例項化類的方法就使用不了了,因為私有化的建構函式外部不能使用。
error: 『csingleton::csingleton()』 is private
既然建構函式私有了,那麼只能被類內部使用了,所以可以提供乙個共用的函式供外部使用,然後這個函式返回乙個物件。為了保證這個函式多次呼叫 返回的是乙個物件,所以抱著個函式設定為靜態的,於是有了下面的**:
#includeusing namespace std;
class singleton
static singleton* m_instace;
private:
singleton(){}
//把複製建構函式和=操作符也設為私有,防止被複製
singleton(const singleton&);
singleton& operator=(const singleton&);
};singleton* singleton::m_instace = new singleton;
int main()
執行**發現
這種模式優點就是空間換時間。
還有一種單例模式的實現被稱為懶漢模式(時間換空間),即第一次使用時,才例項化物件。
class singleton
return m_instace;
} static singleton* m_instace;
private:
singleton(){}
};singleton* singleton::m_instace=nullptr;
於是上面的**就能解決,但是發現如果兩個執行緒同時獲取例項化物件呢?顯然是不行的,會出現兩個執行緒同時要物件的時候指標還都是空的情況就完了,想到這種情況你肯定會毫不猶豫的去加個鎖。但是只加鎖回導致多執行緒下阻塞機會加大,因此實現雙層檢測。
#include #include #incldue using namespace std;
class singleton
m_mtx.unlock();
} return m_instace;
} void print()
class delete
} static delete d;
};private:
singleton(){}
singleton(const singleton&) = delete;
singleton& operator=(const singleton&) = delete;
static singleton* m_instace; //單例物件指標
static mutex m_mtx; //互斥鎖
};void func(int n)
singleton* singleton::m_instace = nullptr;
mutex singleton::m_mtx;
singleton::delete d;
int main()
C 單例模式
include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...
C 單例模式
實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...
C 單例模式
效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...