锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓銆丼ingleton鍗曚歡妯″紡 -鍒涘緩鍨?/font>
銆婅璁℃ā寮忋嬩腑鎸囧嚭錛歋ingleton妯″紡鐨勬剰鍥撅細(xì)淇濊瘉涓涓被浠呮湁涓涓疄渚嬶紝騫舵彁渚涗竴涓闂畠鐨勫叏灞璁塊棶鐐廣?/font>
瀵逛竴浜涚被鏉ヨ錛屽彧鏈変竴涓疄渚嬫槸寰堥噸瑕佺殑錛屾庝箞鎵嶈兘淇濊瘉涓涓被鍙湁涓涓疄渚嬪茍涓旇繖涓疄渚嬫槗浜庤璁塊棶錛岄鍏堬紝涓涓叏灞鍙橀噺浣垮緱涓涓璞″彲浠ヨ璁塊棶錛屽叾嬈″氨鏄庝箞淇濊瘉鍙湁 涓涓疄渚嬶紝涓涓洿濂界殑鏂規(guī)硶鏃惰綾昏嚜韜礋璐d繚瀛樺畠鐨勫敮涓瀹炰緥錛岃繖涓被鍙互淇濊瘉娌℃湁鍏朵粬瀹炰緥鍙互琚垱寤猴紝騫朵笖浠栨彁渚涗竴涓闂瀹炰緥鐨勬柟娉曘傝繖涓氨鏄疭ingleton妯″紡銆?/font>
褰撳ぇ閲忕殑綾繪垨鑰呮ā鍧楅渶瑕佽闂竴涓叏灞瀵硅薄鏃訛紝浣跨敤鍗曢棿妯″紡錛?/font>
褰撹繖涓敮涓鐨勫疄渚嬪簲璇ユ槸閫氳繃瀛愮被鍖栧彲鎵╁睍鐨勶紝騫朵笖瀹㈡埛搴旇鏃犻渶鏇磋鏀逛唬鐮佸氨鑳戒嬌鐢ㄤ竴涓墿灞曠殑瀹炰緥鏃訛紝浣跨敤鍗曢棿妯″紡
綾誨寘鍚簡(jiǎn)鎸囧悜瀹冨敮涓瀹炰緥鐨勬寚閽堬紝瀹氫箟涓涓狪nstance鎿嶄綔錛屽厑璁稿鎴瘋闂畠鐨勫敮涓瀹炰緥錛孖nstance鏄竴涓被鎿嶄綔,閫氳繃鎻愪緵涓涓猻tatic鐨勬帴鍙f潵鑾峰彇瀹炰緥銆?/font>
鍦ㄨ璁℃父鎴忓紩鎿庢椂錛屽浜庣汗鐞嗗璞★紝濡傛灉綾葷殑姣忎竴涓璞′唬琛ㄤ竴涓創(chuàng)鍥懼璞★紝姣忔閮借皟鐢ㄥ嚱鏁頒粠鏂囦歡鍔犺澆錛屽娍蹇呴犳垚鎬ц兘涓嬮檷銆佹氮璐瑰唴瀛樸備負(fù)浜?jiǎn)纭繚姣忎釜绾圭悊鍔犺浇涓嬈★紝鍙互浣跨敤鍗曚歡妯″紡錛岃綾昏嚜宸辮礋璐e畠鐨勫垱寤猴紝鍦ㄨ闂嚱鏁頒腑鎴彇錛屼嬌鐢↙azy Initiation錛?褰撶鏈夌殑瀹炰緥涓虹┖鏃訛紝鎵嶈繘琛屽垱寤猴紝褰撶劧榪樿媯(gè)鏌ユ槸鍚︿負(fù)絀烘椂瑕佸姞閿侊紝鍚﹀垯鍦ㄧ珵浜夋椂浼?xì)鍑虹庮C袱涓嚎紼嬪悓鏃跺父瑙佽岃鍞竴鐨勫疄渚嬪彉鎴愬涓?/font>
#ifndef _SINGLEONTEXTURE_H_ #define _SINGLEONTEXTURE_H_ class SingletonTexture{ public: static SingletonTexture* Instance();//鍏ㄥ眬璁塊棶鐐?/span> protected: SingletonTexture();//鑷繁璐熻矗鍒涘緩 private: static SingletonTexture* m_instance;//淇濆瓨鑷繁鐨勪竴涓疄渚?/span> }; #endif _SINGLEONTEXTURE_H_
#include <windows.h> #include "iostream" using namespace std; #include "Singleton.h" SingletonTexture* SingletonTexture::m_instance = NULL; SingletonTexture::SingletonTexture (){ cout<<"SingletonTexture Created!"<<endl; } SingletonTexture* SingletonTexture::Instance (){ if(m_instance == NULL){ m_instance = new SingletonTexture(); cout<<"m_instance == NULL"<<endl; } return m_instance; } int main(){ SingletonTexture* ST = SingletonTexture::Instance (); system("pause"); return 0; }
榪欐牱鍙敤鍒涘緩涓涓潪鏈湴鐨勯潤(rùn)鎬佸璞″氨鍙互錛屼絾鏄叿浣撶殑鍒涘緩鏃墮棿鏃犳硶紜畾錛岃В鍐沖姙娉曞氨鏄妸璁塊棶榪欎釜鍗曚歡綾葷殑琛屼負(fù)灝佽鍦ㄤ竴涓嚱鏁板唴錛屽綋璋冪敤浜?jiǎn)杩欎釜鍑芥暟鏃跺Q屾墠瀵瑰崟浠剁被榪涜鐪熸鐨勫垱寤猴紝
class SingletonTexture{ public: SingletonTexture &Instance(){ static SingletonTexture Obj; return Obj; } private錛? SingletonTexture(); }錛?/span>
瀵逛簬絎竴縐嶆柟娉曠敱浜庝嬌鐢ㄤ簡(jiǎn)綾葷殑闈?rùn)鎬佹垚鍛橈紝鍦ㄥ唴瀛樹腑闄や簡(jiǎn)姣忎釜瀵硅薄鑷繁鐨勬暟鎹垚鍛樹互澶栵紝榪樹細(xì)淇濈暀涓浠芥湁鍏蟲墍鏈夌汗鐞嗗璞′俊鎭垪琛紝铏界劧浣跨敤浜?jiǎn)鎸囬拡锛屼絾鏄斪兒庢病鏈壘c誨啀浠庤繖涓被緇ф壙涓嬪幓錛岃屼笖鎵鏈夌殑瀵硅薄閮芥槸涓涓被錛岀浉浜掍箣闂存病鏈夎祫婧愰噴鏀劇殑鍏堝悗闂錛屽氨涓嶄細(xì)鍑虹幇鐢變簬閲婃斁欏哄簭鍑虹幇鎮(zhèn)┖闂銆備絾鏄敱浜庡悓鏃跺鍏ㄩ儴鐨勭汗鐞嗚繘琛屽鐞嗭紝鍙兘浼?xì)閫犳垚璧勬簮璐熻嵎榪囬噸錛岃寤虹珛涓涓棩蹇楋紱鑰岀浜岀鏂規(guī)硶姣旇緝絎﹀悎瑕佹眰銆?/font>
浣跨敤鍗曚歡妯″紡錛岃屼笉綆鍗曠殑鍒涘緩涓涓叏灞瀵硅薄鎴栬呮寚閽堬紝棣栧厛閫氳繃綆鍗曠殑鍑芥暟璁塊棶鍙橀噺姣斿湪鎵鏈夋枃浠朵腑澹版槑extern綆鍗曪紝鑰屼笖榪樺彲浠ユ帶鍒跺彉閲忓垵濮嬪寲鐨勬椂闂達(dá)紱鍏舵浣跨敤鎸囬拡鑰屼笉鏄敤瀵硅薄鐨勮瘽錛屽彲浠ラ氳繃C++瀵瑰璞¤繘琛屽畬鍏ㄧ殑璁塊棶錛屾湁鏇村ソ鐨勮闂帶鍒訛紝渚嬪瀵圭被姣忎竴嬈$殑璁塊棶榪涜鐩戞帶錛涙渶鍚庤繕鍙互鍒涘緩singleton綾葷劧鍚庡啀媧劇敓錛屽彲浠ュ啀淇濊瘉鍩虹被浠ュ強(qiáng)闆嗘垚綾葷殑鏉′歡涓嬶紝鎵╁厖鍩虹被銆?/font>
浜屻丗acade錛堝瑙傦級(jí)妯″紡-瀵硅薄緇撴瀯鍨嬫ā寮?/font>
銆婅璁℃ā寮忋嬩腑鎻愬埌澶栬妯″紡鐨勬剰鍥炬槸涓哄瓙緋葷粺涓殑涓緇勬帴鍙f彁渚涗竴涓竴鑷寸殑鐣岄潰錛孎acade妯″紡瀹氫箟浜?jiǎn)涓涓珮灞傛帴鍙o紝榪欎釜鎺ュ彛浣垮緱榪欎釜瀛愮郴緇熸洿鍔犲鏄撲嬌鐢ㄣ?/font>
瀹炵敤鎬э細(xì)
1.褰撲綘瑕佷負(fù)涓涓鏉傚瓙緋葷粺鎻愪緵涓涓畝鍗曟帴鍙f椂錛屽瓙緋葷粺寰寰瑕佷笉鏂紨鍖栬屽彉鐨勫鏉傦紝澶у鏁版ā寮忎嬌鐢ㄦ椂閮戒細(xì)浜х敓鏇村皬鐨勭被錛岃繖浣垮緱瀛愮郴緇熸洿鍏鋒湁閲嶇敤鎬э紝涔熸洿瀹規(guī)槗瀵瑰瓙緋葷粺榪涜瀹氬埗錛屼絾鏄繖涔熺粰閭d簺涓嶉渶瑕佸畾鍒跺瓙緋葷粺鐨勭敤鎴峰甫鏉ヤ簡(jiǎn)涓浜涗嬌鐢ㄤ笂鐨勫洶闅撅紝Facade鍙互鎻愪緵涓涓畝鍗曠殑緙虹渷瑙嗗浘錛岃繖涓瑙嗗浘瀵瑰ぇ澶氭暟鐢ㄦ埛宸茬粡澶熶簡(jiǎn)錛岃岄偅浜涢渶瑕佹洿澶氱殑瀹氬埗鐨勭敤鎴峰彲浠ヨ秺榪嘑acade榪欎竴灞傘?/font>
2.瀹㈡埛紼嬪簭涓庢娊璞$被鐨勫疄鐜伴儴鍒嗕箣闂村瓨鍦ㄥ緢澶х殑渚濊禆鎬с傚紩鍏acade妯″紡灝嗚繖涓瓙緋葷粺涓庡鎴蜂互鍙?qiáng)鍏朵粬鐨勫瓙绯痪l熷垎紱伙紝鍙互鎻愰珮瀛愮郴緇熺殑鐙珛鎬у拰鍙Щ妞嶆с?/font>
3.褰撲綘闇瑕佹瀯寤轟竴涓眰嬈$粨鏋勭殑瀛愮郴緇熸椂錛屼嬌鐢╢acade妯″紡瀹氫箟瀛愮郴緇熺殑姣忓眰鐨勫叆鍙g偣銆傚鏋滃瓙緋葷粺涔嬮棿鏄浉浜掍緷璧栫殑錛屽彲浠ヨ浠栦滑閫氳繃facade榪涜閫氳錛屼粠鑰岀畝鍖栦簡(jiǎn)浠栦滑涔嬮棿鐨勪緷璧栧叧緋匯?/font>
鍦ㄨ璁″叿鏈変竴瀹氬鏉傚害鐨勫浘褰㈠紩鎿庢椂錛屽畠涔熷叿鏈夋墿灞曞拰鍙樺寲鐨勬綔鍦ㄥ彲鑳斤紝鍥犳浼?xì)鋴慑緱鏁翠釜绯痪l熶箣闂寸殑閫氫俊鍜岀浉浜掍緷璧栧鍔狅紝瀵艱嚧緋葷粺澶嶆潅錛岀伒媧繪ч檷浣庯紝浣跨敤Facade妯″紡灝嗚澶氬鏉傛у拰鍙樺寲闅愯棌璧鋒潵錛岄珮搴﹀皝瑁呭浘褰㈠紩鎿庯紝浣垮浘褰㈠紩鎿庤繖涓瀛愮郴緇熸洿鍔犲鏄撲嬌鐢紝鍚屾椂鐢變簬榪欎竴瀛愮郴緇熺嫭涓鏃犱簩錛屽簲褰撲綔涓轟竴涓猄ingleton銆?
涓轟簡(jiǎn)浣跨被涔嬮棿鐨勭浉鍏蟲э紙鑰﹀悎鎬э級(jí)杈懼埌鏈灝忥紝鏈夊繀瑕佷嬌鐢‵acade鎴栫鐞嗗櫒錛屽綋鏁翠釜瀛愮郴緇熼渶瑕佽繘琛屽ぇ鐨勬敼鍔ㄦ垨鑰呮槸鏇挎崲鐨勬椂鍊欙紝澶嶆潅鐨勭浉鍏蟲у氨浼?xì)漶旂敓闂锛岄潰鍚戝璞〗E嬪簭璁捐鍦ㄧ被鐨勮寖鍥村唴瀵瑰疄鐜版敼鍔ㄨ繘琛屼簡(jiǎn)淇濇姢錛屼絾鏇村箍娉涚殑鏀瑰姩淇濇姢闇瑕佷竴縐嶆柊鐨勮寖寮忥紝Facade妯″紡鍦ㄦ洿澶ц妯′笂瑙e喅浜?jiǎn)闈㈠悜瀵硅薄缂柦E嬫墍淇濇姢鐨勫悓綾婚棶棰樸傚疄鐜癋acade綾葷殑棣栬鍘熷垯鏄細(xì)灝介噺閬垮厤瀛愮郴緇熷唴閮ㄧ被瀵瑰鐨勬毚闇層?/font>
緇撴瀯錛?/font>
#ifndef _FACADE_H_ #define _FACADE_H_ class SubSystemOne{ public: SubSystemOne(){ } ~SubSystemOne(){ } void Operator(); }; class SubSystemTwo{ public: SubSystemTwo(){ } ~SubSystemTwo(){ } void Operator(); }; class Facade{ public: Facade(); ~Facade(); void Operator(); private: SubSystemOne *so; SubSystemTwo *st; }; #endif _FACADE_H_
#include "windows.h" #include <iostream> using namespace std; #include "Facade.h" void SubSystemOne::Operator(){ cout<<"SubSystemOne Operator!"<<endl; } void SubSystemTwo::Operator(){ cout<<"SubSystemTwo Operator!"<<endl; } Facade::Facade(){ so = new SubSystemOne(); st = new SubSystemTwo(); } Facade::~Facade (){ delete so; delete st; } void Facade::Operator (){ so->Operator(); st->Operator(); } int main(){ Facade * facade = new Facade(); facade->Operator (); system("pause"); return 0; }
Facade妯″紡鍦ㄩ珮灞傛彁渚涗簡(jiǎn)涓涓粺涓鐨勬帴鍙o紝鏇村儚鏄竴涓鐞嗙被錛岃В钘曚簡(jiǎn)緋葷粺錛岃璁℃ā寮忎腑榪樻湁鍙﹀涓縐峂ediator妯″紡鍜孎acade妯″紡鏈夌被浼煎湴鏂癸紝浣嗘槸Mediator 涓昏鐩殑鏄璞¢棿鐨勮闂В鑰︺?/font>
涓夈丼tate錛堢姸鎬侊級(jí)妯″紡- 瀵硅薄琛屼負(fù)妯″紡
銆婅璁℃ā寮忋嬩腑鎸囧嚭state 妯″紡鍏佽涓涓璞″湪鍏跺唴閮ㄧ姸鎬佹敼鍙樻椂鏀瑰彉瀹冪殑琛屼負(fù)銆傚璞$湅璧鋒潵浼間箮淇敼浜?jiǎn)瀹冪殑绫汇?/font>
閫傜敤鎬?/font>
涓涓璞$殑琛屼負(fù)鍙栧喅浜庡畠鐨勭姸鎬侊紝騫朵笖瀹冨繀欏誨湪榪愯鏃跺埢鏍規(guī)嵁鐘舵佹敼鍙樺畠鐨勮涓猴紱
涓涓搷浣滀腑鍚湁搴炲ぇ鐨勫鍒嗘敮鐨勬潯浠惰鍙ワ紝涓旇繖浜涘垎鏀緷璧栦簬璇ュ璞$殑鐘舵侊紝榪欎釜鐘舵侀氬父鐢ㄤ竴涓垨鑰呭涓灇涓懼父閲忚〃紺恒傞氬父錛屾湁澶氫釜鎿嶄綔鍖呭惈榪欎竴鐩稿悓鐨勬潯浠剁粨鏋勩俿tate妯″紡灝嗘瘡涓涓潯浠跺垎鏀斁鍏ヤ竴涓嫭绔嬬殑綾諱腑錛屼嬌寰椾綘鍙互鏍規(guī)嵁瀵硅薄鑷韓鐨勬儏鍐靛皢瀵硅薄鐨勭姸鎬佷綔涓轟竴涓璞★紝榪欎竴瀵硅薄鍙互涓嶄緷璧栧叾浠栧璞¤岀嫭绔嬪彉鎹€?/font>
鍦ㄦ父鎴忎腑錛岀▼搴忓憳闇瑕佸鐞嗘父鎴忕姸鎬佽屼笉鏂殑瀹炴椂榪借釜闂錛岀姸鎬佸湪鍒氬紑濮嬬殑鏃跺欓氬父鏄畝鍗曠殑鏋氫婦錛屽叾琛屼負(fù)瀹炵幇鍩轟簬switch…case緇撴瀯鐨勯夋嫨錛岀劧鍚庡綋鐘舵佺殑鏁伴噺澧炲ぇ錛岀淮鎶や竴緇剆witch…case璇彞浼?xì)鏄竴浠跺紓甯稿洶闅懼茍涓斿嚭閿欑巼杈冮珮鐨勪簨鎯呫傦紝鑰屼笖鐘舵侀昏緫涓庡姩浣滃疄鐜版病鏈夊垎紱伙紝鍔ㄤ綔鐨勪唬鐮佺洿鎺ュ啓鍦ㄧ姸鎬佺殑閫昏緫涓紝灝嗕嬌緋葷粺鐨勫彲鎵╁睍鎬у拰緇存姢鎬фц兘鍙樹綆銆俿tate妯″紡灝嗙姸鎬侀昏緫涓庡姩浣滃疄鐜板垎紱誨紑鏉ワ紝褰撲竴涓搷浣滀腑鑽淮鎶ゅぇ閲忕殑case鍒嗘敮璇彞錛屽茍涓旇繖浜涘垎鏀鍙ヤ緷璧栦簬瀵硅薄鐨勭姸鎬侊紝state妯″紡灝嗘瘡涓涓垎鏀兘鐙珛灝佽鍒扮嫭绔嬬殑綾諱腑銆?/font>
緇撴瀯錛?/font>
紺轟緥錛?/p>
#ifndef _STATE_H_ #define _STATE_H_ class State; class Context{ public: Context(State *ps); ~Context(); void Request(); void ChangeState(State *ps); private: State *m_state; }; class State{ public: State(){} virtual ~State(){} virtual void Handle(Context *context)=0; }; class StateA : public State{ public: StateA(){} ~StateA(){} void Handle(Context *context); }; class StateB : public State{ public: StateB(){} ~StateB(){} void Handle(Context *context); }; #endif _STATE_H_
#include <windows.h> #include <iostream> using namespace std; #include "State.h" Context::Context (State *ps) :m_state(ps){ } Context::~Context (){ delete m_state; } void Context::Request (){ if(m_state!=NULL){ m_state->Handle (this); } } void Context::ChangeState (State *ps){ if(m_state!=NULL){ delete m_state; m_state = NULL; } m_state = ps; } void StateA::Handle (Context *context){ cout<<"Handle By StateA!"<<endl; if(context!=NULL){ context->ChangeState (new StateB()); } } void StateB::Handle (Context *context){ cout<<"Handle By StateA!"<<endl; if(context!=NULL){ context->ChangeState (new StateA()); } } int main(){ State *pstate = new StateA(); Context *pcontext = new Context(pstate); pcontext->Request (); pcontext->Request (); pcontext->Request (); delete pcontext; system("pause"); return 0; }
state妯″紡寰堝ソ鐨勫疄鐜頒簡(jiǎn)瀵硅薄鐨勭姸鎬侀昏緫鍜屽姩浣滃垎紱伙紝鐘舵侀昏緫鍒嗗竷鍦╯tate鐨勬淳鐢熺被涓疄鐜幫紝鑰屽姩浣滃疄鐜板垯鍙互鏀懼湪Context綾諱腑瀹炵幇錛坰tate媧劇敓綾諱腑闇瑕佹湁涓涓狢ontext鎸囬拡錛夛紝浣垮緱涓よ呯殑鍙樺寲鐩鎬簰鐙珛錛屾敼鍙楽tate鐨勭姸鎬侀昏緫鍙互寰堝鏄撶殑鏈嶇敤Context鐨勫姩浣滐紝涔熷彲浠ュ啀涓嶅獎(jiǎng)鍝峴tate媧劇敓綾葷殑鍓嶆彁涓嬪垱寤篊ontext鐨勫瓙綾繪潵鏇存敼鎴栨浛鎹㈠姩浣滃疄鐜般?/font>
State妯″紡闂涓昏鏄昏緫鍒嗘暎鍖栵紝鐘舵侀昏緫鍒嗗竷鍒頒簡(jiǎn)鍚勪釜state 瀛愮被涓紝寰堥毦鐪嬪垁鍒版暣涓姸鎬侀昏緫鍥撅紝甯︽潵浜?jiǎn)浠g爜鐨劸l存姢闂銆?/font>