0. Introduction
鎺ヨЕ璁捐妯″紡鏈変袱騫存椂闂翠簡錛屼絾涓鐩存病鏈夌郴緇熸暣鐞嗚繃錛屼負浜嗕笉鑷充簬璁╄嚜宸辯殑鎬濈淮琚箒鐞愮殑宸ヤ綔涓鐐圭偣紱侀敘錛岃繕鏄喅瀹氭葷粨涓涓嬶紝涓轟簡鑳藉鐪熸鍋氬埌鏈夋墍鏀惰幏錛屾暣涓郴鍒椾細鎸夌収GoF鐨凞esign Patterns: Elements of Reusable Object-Oriented Software鐨勮鏂囨濊礬錛屼絾涓嶄細鐓ф湰瀹g灝辨槸浜嗭紝Wikipedia涓婂叧浜?3縐嶈璁℃ā寮忕殑浠嬬粛闈炲父鍏ㄩ潰錛孋SDN涓婁篃鍙互涓嬭澆涓?鑻辨枃鐢靛瓙妗o紝鍥犳寰堝濂楄瘽銆佺被鍥句竴姒傜渷鍘匯?/p>
鏈鏃╂帴瑙﹁璁℃ā寮忕殑鏃跺欙紝闅懼厤琚悇縐嶆ā寮忕殑鑱旂郴鍜屽尯鍒墍鍥版壈錛屼粠鏁欑涔︾殑鍒嗘瀽鍙互寰楀埌妯″紡涔嬮棿褰㈠紡涓婄殑涓嶅悓銆備絾榪欐牱瀵逛簬棰嗕細璁捐妯″紡鎰忎箟涓嶅ぇ錛屽洜涓烘垜浠帉鎻℃ā寮忕殑鐩殑鏄負浜嗚瀺浼氳瘡閫氾紝鐏墊椿榪愮敤錛屼互瀵瑰紑鍙戞湁鎵甯姪銆?/p>
紼嶅井鎴愯妯$殑OO紼嬪簭錛屼細鏈夊ぇ閲忓璞★紝鍏朵腑寰堝瀹炰綋瀵硅薄涔嬮棿瀛樺湪鐫鐖跺瓙銆佸厔寮?/strong>鍏崇郴錛屽璞$殑鍒涘緩鎻愬崌涓轟竴縐嶆ā寮忋傚叾濂藉鍦ㄤ簬璁捐妯″紡鏈韓鎵瀹gО鐨?strong>reusable錛岃繖灝卞儚鍫嗙Н鏈ㄧ洊鎴垮瓙涓鏍鳳紝鍫嗙殑濂界殑鎯呭喌涓嬶紝鎹竴鎹㈤棬紿椾究鏄彟涓鐣鏅?/p>
鍏充簬瀹炵幇錛屾垜涓嶄細涓轟簡鍘樻竻妯″紡闂寸殑鍖哄埆鑰屽埢鎰忎嬌鐢ㄧ浉浼間唬鐮佸疄鐜幫紝鐩稿弽錛屾垜浼氭牴鎹ā寮忔湰韜殑閫傜敤鎯呭喌涓句緥錛岃屼笖澶ч噺浠g爜鍩轟簬SourceMaking銆?/p>
_______________________________
1. Creational Design Patterns(DP)
鍒涘緩鍨婦P鎶借薄浜嗙被鍜屽璞$殑鍒涘緩榪囩▼錛?a title="Gang of four" target="_blank">GoF緇欏嚭浜?縐?strong>鍒涘緩鍨婦P錛?strong>Abstract Factory銆?strong>Builder銆?strong>Factory Method銆?strong>Builder銆?strong>Prototype銆?strong>Singleton銆?/p>
2. Abstract Factory
鎰忓浘錛氭彁渚涗竴涓垱寤轟竴緋誨垪鐩稿叧鎴栫浉浜掍緷璧栧璞$殑鎺ュ彛錛岃屾棤闇鎸囧畾瀹冧滑鍏蜂綋鐨勭被銆?/strong>
1) 鍙彁渚涗簡涓涓垱寤烘帴鍙o紝鍏惰繑鍥炲間負鍏蜂綋浜у搧錛氬AbstractProduct *Client::CreateProduct(AbstractFactory &factory);
2) 鎺ュ彛鐨勫弬鏁版槸涓涓?strong>宸ュ巶瀵硅薄錛?code>AbstractFactory &factory錛夌殑寮曠敤錛屽弬鏁扮被鍨嬶紙AbstractFactory
錛変負鎶借薄鍩虹被錛岃皟鐢ㄦ椂鏍規嵁闇瑕佷紶鍏ュ叿浣撳伐鍘傚璞″嵆鍙紱
3) 鎺ュ彛鍐呴儴瀹炵幇浜?strong>涓緋誨垪鐩稿叧鎴栫浉浜掍緷璧栧璞?/strong>錛堟娊璞′駭鍝侊級鐨勫垱寤猴細褰撲紶鍏ュ叿浣撳伐鍘傛椂錛屾帴鍙e疄鐜扮殑灝辨槸涓緋誨垪鍏蜂綋浜у搧鐨勫垱寤猴紱
4) 鍒涘緩鐨勪駭鍝?strong>绔嬪嵆榪斿洖錛?code>CreateProduct錛夈?/p>
鍙備笌鑰咃細
• AbstractFactory
鈥?澹版槑涓涓垱寤烘娊璞′駭鍝佸璞$殑鎿嶄綔鎺ュ彛銆?/p>
• ConcreteFactory
鈥?瀹炵幇鍒涘緩鍏蜂綋浜у搧瀵硅薄鐨勬搷浣溿?/p>
• AbstractProduct
鈥?涓轟竴綾諱駭鍝佸璞″0鏄庝竴涓帴鍙c?/p>
• ConcreteProduct
鈥?瀹氫箟涓涓皢琚浉搴旂殑鍏蜂綋宸ュ巶鍒涘緩鐨勪駭鍝佸璞°?br>鈥?瀹炵幇AbstractProduct鎺ュ彛銆?/p>
• Client
鈥?浠呬嬌鐢ㄧ敱AbstractFactory鍜孉bstractProduct綾誨0鏄庣殑鎺ュ彛銆?/p>
浠g爜錛?/strong>
class AbstractFactory
{
public:
virtual AbstractProduct *MakePartA() = 0;
virtual AbstractProduct *MakePartB() = 0;
virtual AbstractProduct *MakePartC() = 0;
virtual AbstractProduct *AddPart(const AbstractProduct *pPart) = 0;
};
AbstractProduct *Client::CreateProduct(AbstractFactory &factory)
{
AbstractProduct *pProduct = factory.CreateProduct();
AbstractProduct *pPartA = factory.MakePartA();
AbstractProduct *pPartB = factory.MakePartB();
AbstractProduct *pPartC = factory.MakePartC();
factory.AddPart(pPartA);
factory.AddPart(pPartB);
factory.AddPart(pPartC);
return pProduct;
}
int main(void)
{
Client client;
ConcreteFactory factory;
client.CreateProduct(factory);
return 0;
}
3. Builder
鎰忓浘錛氬皢涓涓鏉傚璞$殑鏋勫緩涓庡畠鐨勮〃紺哄垎紱伙紝浣垮緱鍚屾牱鐨勬瀯寤鴻繃紼嬪彲浠ュ垱寤轟笉鍚岀殑琛ㄧず銆?/strong>
1) director鎻愪緵鎶借薄浜у搧鍒涘緩鎺ュ彛錛氬void Director::Construct();
2) 涓嶅悓浜у搧浣跨敤鍚屼竴鍒涘緩榪囩▼錛岀敱director鎸囧畾鐗瑰畾builder浠ョ敓浜т笉鍚屼駭鍝侊紱
3) 鎺ュ彛鍐呴儴瀹炵幇浜?strong>涓涓鏉傚璞?/strong>錛堟娊璞′駭鍝侊級鐨勫垱寤猴細褰撲紶鍏ュ叿浣撳伐鍘傛椂錛屾帴鍙e疄鐜扮殑鏄?strong>涓涓鏉傜殑鍏蜂綋浜у搧鐨勫垱寤猴紱
4) 鍒涘緩鐨勪駭鍝?strong>騫朵笉绔嬪嵆榪斿洖錛?strong>鍒涘緩瀹屾瘯鍚庤繑鍥烇紝鎴?strong>浣跨敤鎺ュ彛錛?code>GetProduct錛夋彁鍙栫粨鏋溿?/p>
鍙備笌鑰咃細
• Builder
鈥?涓哄垱寤轟竴涓狿roduct瀵硅薄鐨勫悇涓儴浠舵寚瀹氭娊璞℃帴鍙c?/p>
• ConcreteBuilder
鈥?瀹炵幇Builder鐨勬帴鍙d互鏋勯犲拰瑁呴厤璇ヤ駭鍝佺殑鍚勪釜閮ㄤ歡銆?br>鈥?瀹氫箟騫舵槑紜畠鎵鍒涘緩鐨勮〃紺恒?br>鈥?鎻愪緵涓涓绱駭鍝佺殑鎺ュ彛銆?/p>
• Director
鈥?鏋勯犱竴涓嬌鐢˙uilder鎺ュ彛鐨勫璞°?/p>
• Product
鈥?琛ㄧず琚瀯閫犵殑澶嶆潅瀵硅薄銆侰oncreteBuilder鍒涘緩璇ヤ駭鍝佺殑鍐呴儴琛ㄧず騫跺畾涔夊畠鐨勮閰嶈繃紼嬨?br>鈥?鍖呭惈瀹氫箟緇勬垚閮ㄤ歡鐨勭被錛屽寘鎷皢榪欎簺閮ㄤ歡瑁呴厤鎴愭渶緇堜駭鍝佺殑鎺ュ彛銆?/p>
浠g爜錛?/strong>
class Builder
{
public:
virtual void MakePartA() = 0;
virtual void MakePartB() = 0;
virtual void MakePartC() = 0;
Product *GetProduct() { return _product; }
protected:
Product *_product;
};
class Director
{
public:
void setBuilder(Builder *b) { _builder = b; }
void Construct();
private:
Builder *_builder;
};
void Director::Construct()
{
_builder.MakePartA();
_builder.MakePartB();
_builder.MakePartC();
}
int main(void) {
ConcreteBuilderA concreteBuilderA;
ConcreteBuilderB concreteBuilderB;
Director director;
Product *pProduct;
director.SetBuilder(&concreteBuilderA);
director.Construct();
pProduct = concreteBuilderA.GetProduct();
pProduct->Show();
director.SetBuilder(&concreteBuilderB);
director.Construct();
pProduct = concreteBuilderB.GetProduct();
pProduct->Show();
return 0;
}
4. Factory Method
鎰忓浘錛氬畾涔変竴涓敤浜庡垱寤哄璞$殑鎺ュ彛錛岃瀛愮被鍐沖畾瀹炰緥鍖栧摢涓涓被銆侳actory Method浣夸竴涓被鐨勫疄渚嬪寲寤惰繜鍒板叾瀛愮被銆?/strong>
1) 鐪嬪緱鍑鴻妯″紡鍏跺疄灝辨槸C++鐨勫鎬佺壒鎬?/strong>錛屽?strong>緇ф壙瀹炵幇銆傚洜姝わ紝鍏跺埆鍚嶄負铏氭瀯閫犲櫒錛?Virtual Constructor錛?/strong>錛?/p>
2) 浣滀負妯″紡涓嶤++澶氭佺壒鎬т笉鍚岀殑鏄紝Creator鍙互瀹氫箟宸ュ巶鏂規硶鐨勭己鐪佸疄鐜?/strong>錛屽畬鎴愮己鐪佹搷浣滐紝MFC澶ч噺浣跨敤浜嗚繖涓鎬濇兂銆?/p>
鍙備笌鑰咃細 • Product • ConcreteProduct • Creator • ConcreteCreator 浠g爜錛?/strong> int main(void) { pProduct = creator.FactoryMethod(); return 0; 5. Prototype 鎰忓浘錛氱敤鍘熷瀷瀹炰緥鎸囧畾鍒涘緩瀵硅薄鐨勭綾伙紝騫朵笖閫氳繃鎷瘋礉榪欎簺鍘熷瀷鍒涘緩鏂扮殑瀵硅薄銆?/strong> 1) 鍒涘緩涓嶅啀閫氳繃宸ュ巶鏂扮被緇ф壙錛坕nheritance錛?/strong>錛岃屾槸閫氳繃濮旀墭錛坉elegation錛?/strong>錛?/p>
2) 鏍歸?strong>鎷瘋礉鍘熷瀷瀹炰緥 鍙備笌鑰咃細 • ProtoType • ConcreteProtoType • Client 浠g爜錛?/strong> class ProtoType class ProtoTypeA: public ProtoType class ProtoTypeB: public ProtoType class Client private: ProtoType* Client::s_prototypes[] = { 0, new ProtoTypeA, new ProtoTypeB }; ProtoType *Client::Clone(int choice) 6. Singleton 鎰忓浘錛氫繚璇佷竴涓被浠呮湁涓涓疄渚嬶紝騫舵彁渚涗竴涓闂畠鐨勫叏灞璁塊棶鐐廣?/strong> 1) 鐢?strong>闈欐佹垚鍛樺嚱鏁?/strong>淇濊瘉涓婅堪鎰忓浘銆?/p>
鍙備笌鑰咃細 • Singleton 浠g爜錛?/strong> class Singleton void Run() {} private: Singleton *GetSingleton(void) int main(void) return 0; ______________________________________________ 浠g爜鍐欑殑閮芥瘮杈冪畝鍗曪紝鍩烘湰鍙互灝嗗悇縐嶆ā寮忎箣闂寸殑涓嶅悓浣撶幇鍑烘潵浜嗐?/p>
鈥?瀹氫箟宸ュ巶鏂規硶鎵鍒涘緩鐨勫璞$殑鎺ュ彛銆?/p>
鈥?瀹炵幇Product鎺ュ彛銆?/p>
鈥?澹版槑宸ュ巶鏂規硶錛岃鏂規硶榪斿洖涓涓狿roduct綾誨瀷鐨勫璞°侰reator涔熷彲浠ュ畾涔変竴涓伐鍘傛柟娉曠殑緙虹渷瀹炵幇錛屽畠榪斿洖涓涓己鐪佺殑ConcreteProduct瀵硅薄銆?br>鈥?鍙互璋冪敤宸ュ巶鏂規硶浠ュ垱寤轟竴涓狿roduct瀵硅薄銆?/p>
鈥?閲嶅畾涔夊伐鍘傛柟娉曚互榪斿洖涓涓狢oncreteProduct瀹炰緥銆?/p>
ConcreteProduct *ConcreteCreator::FactoryMethod()
{
ConcreteProduct
*pProduct = new ConcreteProduct
;
return pProduct;
}Product *Creator::FactoryMethod()
{
Product *pProduct = new Product;
return pProduct;
}
Creator creator;
ConcreteProduct *pProduct;
pProduct->Show();
}
鈥?澹版槑涓涓厠闅嗚嚜韜殑鎺ュ彛銆?/p>
鈥?瀹炵幇涓涓厠闅嗚嚜韜殑鎿嶄綔銆?/p>
鈥?璁╀竴涓師鍨嬪厠闅嗚嚜韜粠鑰屽垱寤轟竴涓柊鐨勫璞°?/p>
{
public:
virtual void Draw();
virtual ProtoType *Clone() = 0;
virtual void Initialize();
};
{
public:
virtual ProtoType *Clone()
{
return new ProtoTypeA;
}
};
{
public:
virtual ProtoType *Clone()
{
return new ProtoTypeB;
}
};
{
public:
static ProtoType *Clone( int choice );
static ProtoType *s_prototypes[3];
};
{
return s_prototypes[choice]->Clone();
}
鈥?瀹氫箟涓涓狪nstance鎿嶄綔錛屽厑璁稿鎴瘋闂畠鐨勫敮涓瀹炰緥銆侷nstance鏄竴涓被鎿嶄綔錛堝嵆C++涓殑涓涓潤鎬佹垚鍛樺嚱鏁幫級銆?br>鈥?鍙兘璐熻矗鍒涘緩瀹冭嚜宸辯殑鍞竴瀹炰緥銆?/p>
{
public:
static Singleton *GetInstance()
{
if (!s_instance)
s_instance = new Singleton;
return s_instance;
}
static Singleton *s_instance;
Singleton() {} // Singleton cannot be created outside.
};
{
return Singleton::GetInstance();
}
{
GetSingleton()->Run();
}