設計模式 單例模式

2021-09-13 15:38:56 字數 2171 閱讀 3611

單例模式:

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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...