單例模式:
1.構造,拷貝構造遮蔽起來
2.在類中提供乙個介面 生成唯一物件
(1.不能返回類型別;2.不能依賴物件的呼叫)
#includeusing namespace std;
//校長類
class master
return pma;
}private:
master(char* name, int age) :mname(new char[strlen(name) + 1])
master(const master&);//宣告而已
//不會呼叫拷貝構造,因為拷貝構造是用乙個已存在的物件來生成新物件
char* mname;
int mage;
static master* pma;//堆上
//靜態不屬於物件所私有,是屬於作用域的
};master* master::pma = null;//靜態成員需要在類外進行初始化
int main()
類中介面的返回值:master 以類型別返回會生成臨時物件
master* master& 返回指標、引用都可以
類中介面需要設定為靜態:
普通成員方法: _thiscall呼叫約定,依賴於物件的呼叫
該介面是用來生成物件的,但該介面又依賴於物件的呼叫,無法使用
故為 static master *getinstance(char* name, int age); //需擺脫於對物件的依賴
驗證是同乙個物件,除錯結果:
從除錯程式中可以看出,指標永遠指向唯一的物件,因為整個類只能生成乙個物件。
如果是多執行緒情況下,還會存在執行緒安全的問題:(假設有a、b兩個執行緒)
假如a先進行到 if(psing==null)這步,判斷條件為true,恰巧這時時間片到了,b執行這個程式,此時b也進行到這一步,判斷條件為true,然後建立了乙個物件,這時b時間片到了,輪到了a向下執行,此時因為a之前已經判斷過,所以不再判斷,接著上次繼續向下執行,這樣就會把psing指向b的指標斷裂,會存在記憶體洩漏問題,並會生成兩個物件,不滿足單例模式。
解決方案:給臨界區**加鎖
static singleton * getintance()
//unlock
}
return psing;
}這種模式叫做:雙重鎖機制的單例模式
此外,還有一種方式,即在程序開啟之前,就已生成物件,這樣便不會在這方面出現執行緒安全問題。
方案:在類中生成物件, 在 .data段,設定為靜態 static
#includeusing namespace std;
class singleton
private:
singleton(){}
singleton(const singleton&);
static singleton single;//生成的物件在 .data段
};singleton singleton::single;//呼叫預設的建構函式,在main之前,物件就已生成
int main()
除錯結果:
可以看出,single1還未生成,single已經生成。
接著single1才生成。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...