單例模式,顧名思義,即乙個類只有乙個例項物件。
餓漢式寫法全域性只有乙個已經建立好的靜態物件,每次要用時就返回這個物件的引用就行,餓漢式在多執行緒裡面同時getinstance()去獲取這個物件的時候,是不存在安全問題的,餓漢式寫法如下:
#include
using
namespace std;
class
student;~
student()
;int age;
student
(const student &);
//把這個拷貝構造和下一行的操作符過載設為私有,沒必要實現
student&
operator=(
const student &);
//這樣就能防止物件被拷貝
static student myinstance;
// 單例物件在這裡!
public
:static student*
getinstance()
void
printage()
};//靜態物件記得初始化哦,不然會報錯undefined reference to `student::myinstance'
懶漢式和上面餓漢式的區別是:餓漢式是程式執行時一開始就構造了乙個全域性物件,要用的時候去拿就行了。而懶漢式是第一次要用到的時候才去new生成這個物件(所以比較懶),之後獲取的也是第一次new構造出來的物件指標。
同時我們的指標new完之後,在程式結束時,我們需要釋放掉這個指標指向的記憶體,這裡同比較常見方法:定義乙個內部類,這個內部類析構時,,輔助他釋放指標記憶體
#include
using
namespace std;
class
student;~
student()
;student
(const student &);
//設定拷貝構造和操作符=過載防止物件拷貝
student&
operator=(
const student &);
int age;
static student *myinstance;
// 這裡是物件指標,不是乙個例項化物件了
public
:static student*
getinstance()
return myinstance;
//返回物件指標
}void
printage()
private
:// 定義乙個內部類
class
cgarbo
;// 定義乙個內部類的靜態物件
static cgarbo m_garbo;
~cgarbo()
//物件程式結束析構時對主類指標釋放記憶體}}
;};//記得要初始化靜態物件,裡面只是定義了他,沒有分配記憶體空間
不知道大家注意到懶漢式上面的這一段**了嗎
static student*
getinstance()
return myinstance;
//返回物件指標
}
這段**在多執行緒中,比如兩個執行緒,剛好同時執行到if(myinstance==nullptr)的話,兩個執行緒都是判斷myinstance為空,然後就會兩次new操作,這樣就生成了兩個物件,就不是單例模式了。
但是我們可以加入#include<mutex>,然後生成mutex mylock鎖,在執行到這段的時候
static student*
getinstance()
return myinstance;
//返回物件指標
}
這樣加鎖之後,能確保只有乙個物件,但是這樣還不夠好,如果執行緒非常多的話,頻繁加鎖解鎖是效率很低下的。所以對這個懶漢式進行一定的改造全域性**如下:
#include
#include
//多執行緒標頭檔案
#include
using
namespace std;
//建立全域性鎖
mutex mylock;
class
student
;student
(const student &);
student&
operator=(
const student &);
~student()
;static student *myinstance;
int age;
public
:static student *
getinstance()
}return myinstance;
}void
printage()
private
:// 定義乙個內部類
class
cgarbo;~
cgarbo()
}};// 定義乙個內部類的靜態物件
這次對前面的知識重新複習一下收益良多,大家一起學習進步;
單例模式(餓漢式 懶漢式)
2.餓漢式 立即載入 3.懶漢式 延遲載入 定義 單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的辦法。單例模式的要點有兩個 public class singleton 靜態方法,可以加入自定義控制,保證只產生乙個例項 public s...
單例模式 懶漢式 餓漢式
單例 1 訪問頻率高適合做成單例 2 這個類本身就是要描述乙個物件,就是想產生乙個物件就夠了,這樣的情況也是需要維護成乙個物件就ok 了 1 物件訪問高 建立物件不寄存客戶資料 適合 建立物件寄存客戶資料 不適合 第一步 把構造器變成私有的 構造器私有化 就是在別的地方new不成 靜態成員可以直接用...
單例模式(餓漢式 懶漢式)
所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法。public class singleton 靜態方法返回例項 public static singleton getstingleton 這種方式是執行緒安全的 p...