锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
ld: 0711-317 ERROR: Undefined symbol: Virtual table for class "__DynaCastDesc_si_public": first non-inline virtual function in "__Dy
naCastDesc_si_public" is not defined.
ld: 0711-317 ERROR: Undefined symbol: Virtual table for class "eti_cplusplus": first non-inline virtual function in "eti_cplusplus"
is not defined.
璇烽棶錛屽浣曡В鍐籌紵
]]>
]]>
]]>
綆鍗曡灝辨槸瀚佹帴銆備粠綾誨眰嬈″浘鐨勮璁″師鍒欐潵璇達紝灝辨槸璇ュ共浠涔堢殑灝辮瀹冨共浠涔堬紝闇瑕佸崗浣滄椂錛岀粍鍚堝畠浠?/span>
class
Shape {聽聽聽聽聽 聽聽聽聽聽聽 //
涓涓帴鍙?/span>
聽聽聽聽聽聽 virtual void BoundBox() const = 0;
聽聽聽聽聽聽 virtual ~Shape() {};
};
/*
*
涓涓娊璞$被錛屼綔涓?/span>
TextShape
鐨?/span>
Helper
錛屽
TextShape
琛ㄧず鐨勬枃鏈繘琛屾枃
*
鏈寲緙栬緫
*/
class
TextView {
};
class
TextShapeAdapter : public Shape, protected TextView {聽聽聽聽聽 //
涓涓?/span>
Adapter
};
class
TextShapeAdaptee : public Shape {聽聽 聽聽聽聽聽聽 //
涓涓?/span>
Adaptee
聽聽聽聽聽聽
protected
:
聽聽聽聽聽聽
聽聽聽聽聽聽 TextView _helper;
};
Singleton
鑼冨紡鍞竴闇瑕佹敞鎰忕殑灝辨槸瀹冭寖鍥淬傝繖涓寖鍥存牴鎹渶瑕佹潵鎸囧畾錛屽錛?/span>
n聽聽聽聽聽聽聽
涓涓繘紼嬬殑鍦板潃絀洪棿鍐呯殑鍞竴瀹炰緥錛?/span>
n聽聽聽聽聽聽聽
涓涓墿鐞嗘満鍣ㄥ唴錛?/span>
n聽聽聽聽聽聽聽
涓涓櫄鎷熸満鐨勫湴鍧絀洪棿鍐咃紱
n聽聽聽聽聽聽聽
涓涓眬鍩熺綉鍐咃紱
n聽聽聽聽聽聽聽
絳夌瓑銆?/span>
濡傛灉浣犳槸鍦ㄤ竴涓簱涓疄鐜幫紝騫朵笖鍦ㄥ鐢ㄦ埛
-
澶氳繘紼嬬幆澧冧笅榪愯錛屽悓姝ユ帶鍒朵篃搴旇鍦ㄨ璁℃椂灝辮冭檻濂姐?/span>
鍒涘緩鍨嬭璁¤寖寮忎竴鍙ヨ瘽鎻忚堪
錛?/span>
Abstract Factory
鈥斺斾綘瑕佷粈涔堟爣鍑嗗氨瀹炵幇浠涔堟爣鍑嗭紝璋佸彨瀹㈡埛鏄笂甯濆憿錛?/span>
Builder
鈥斺旇閰嶅拰闆嗘垚鎴栦粠涓縐嶅艦寮忓埌鍙︿竴縐嶅艦寮忕殑杞寲錛?/span>
Factory Method
鈥斺旀寫鑷繁鐖辯殑錛涙垨鍙夊鐨勶紝涓嶉夎吹鐨勶紱
Prototype
鈥斺旇嚜鎴戝鍒訛紱
Singleton
鈥斺斿ぉ涓嬫棤鍙岋紱
Prototype
鑼冨紡鏄竴涓繍琛屾椂瀹炰緥鐨勮嚜鎴戝鍒訛紝鍗寵繖涓疄渚嬫妸鑷繁浣滀負瀹冩墍浠h〃鐨勮繖涓被鍨嬬殑宸ュ巶銆傛湁鐐瑰儚銆婅タ娓歌銆嬩腑鐨勫瓩鎮熺┖浠ヨ嚜宸變負鍘熷瀷錛岀敤鑷繁鐨勭尨姣涘彉鎴愯嚜宸變竴鏍楓?/span>
鏈夎繖鏍風殑鑳藉姏闇瑕佸叿澶囩殑鏉′歡鏄細
1銆?/font>
鎻愪緵涓涓綾誨瀷鐨勫疄渚嬩綔涓哄師鍨嬶紝姣斿鐭沖ご閲岃功鍑轟簡瀛欐偀絀轟竴鏍鳳紱
2銆?/font>
榪欎釜瀹炰緥蹇呴』鍏鋒湁鑷垜澶嶅埗鑳藉姏錛屾瘮濡傚瓩鎮熺┖浠庝粬甯堝倕閭h幏寰楃鎶錛?/span>
聽
瀹炵幇榪欎釜鑼冨紡鐨勫熀紜灝辨槸鍦ㄤ竴涓渶瑕佽嚜鎴戝鍒剁殑瀹炰緥涓坊鍔犱竴涓帴鍙o細
class Prototype
{
聽 public:
virtual Prototype clone()
{
聽 //
鏍規嵁鑷繁鐨勯渶瑕佸疄鐜?/span>
};
};
聽
鍘熸枃
Intent
閮ㄥ垎
錛?/span>
聽聽聽聽聽
鈥?/span>
This creates a dilemma: The framework must instantiate classes, but it only knows about abstract classes, which it cannot instantiate.
鈥?/span>
1銆?/span>
Application
浣跨敤
Factory Method
瀵?/span>
Framework
闅愯棌浜?/span>
Document
鐨勫疄鐜扮粏鑺傦紱
class Document
{
聽聽聽聽聽聽 virtual void open() = 0;
聽聽聽聽聽聽 virtual void close() = 0;
};
class Factory
{
聽聽聽聽聽聽 public:
聽聽聽聽聽聽
聽聽聽聽聽聽 //
涓涓櫄鍑芥暟錛岃瀛愮被瀹炵幇浠ヤ究鍐沖畾鐪熷疄鐨?/span>
Document
綾誨瀷錛?/span>
聽聽聽聽聽聽
聽聽聽聽聽聽 virtual Document createDocument() { return 0;};
};
class Application : public Factory
{
聽聽聽聽聽聽 鈥?o:p>
};
class Framework
{
聽聽聽聽聽聽 private:
聽聽聽聽聽聽
聽聽聽聽聽聽 Application _application;
聽聽聽聽聽聽
聽聽聽聽聽聽 Document _document;
聽聽聽聽聽聽 鈥?o:p>
};
2銆?/font>
鎻愪緵
hook
Hook
鏄敤鏉ユ寕涓滆タ鐨勩傝繖涓鎸傜殑涓滆タ瑕佹眰涓?/span>
Hook
鐨勫畾涔夊叿鏈夌浉鍚岀殑鍘熷瀷銆傚湪
C
涓紝瀹冭涓涓嚱鏁版寚閽堝畾涔夛紱鍦?/span>
C++
涓紝鐢變簬
overriding
鐨勬彁渚涳紝瀹冨彲浠ヨ铏氬嚱鏁頒互鍙婄函铏氬嚱鏁板畾涔夛紱
Builder
鑼冨紡鏄竴涓?/span>
Object Creational
鑼冨紡銆?br />
Builder
鑼冨紡涓昏鐢ㄤ簬瑁呴厤錛?/span>
Assembly
錛夊拰闆嗘垚錛?/span>
Integration
錛夈備竴鏄負鐩稿悓鍐呭鍒涘緩涓嶅悓鐨勫睍鐜幫紱浜屾槸浣跨敤涓嶅悓鐨勯儴鍒嗚繘琛岀粍鍚堬紝浜х敓涓縐嶆柊鐨勫璞$被鍨嬨?/span>
鍘熸枃
Intent
閮ㄥ垎
錛?/span>
聽聽聽聽聽聽
鈥?/span>
... create different representations
.
鈥?/span>
聽聽聽聽聽聽
鍙互鐞嗚В涓烘妸鐩稿悓鐨勫唴瀹圭粡榪?/span>
Builder
澶勭悊鍚庯紝鍒涘緩鏂扮殑鎴栬漿鎹㈡垚涓嶅悓鐨勫艦鐘躲傝繖鍙互鎯沖埌緙栬瘧鍣ㄣ佹枃妗g殑鏍煎紡杞崲鍣ㄧ瓑絳夌殑瀹炵幇鍜岀敤閫斻?/span>
Builder
鑼冨紡瑕佹眰浠庣墿鐞嗕笂闅旂浣跨敤鑰呭拰杞崲鍣ㄥ璞°?/span>
杞崲鍣ㄤ嬌鐢ㄨ呮牴鎹嚜宸辯殑闇瑕佽姹傝漿鎹㈠櫒瀵瑰畠閫夊畾鐨勫唴瀹硅繘琛岃瀹氱殑杞崲錛屼絾瀹冨茍涓嶇煡閬撹漿鎹㈠櫒濡備綍杞崲錛涜岃漿鎹㈠櫒鍦ㄦ帴鏀跺埌浣跨敤鑰呬紶閫掔殑鍐呭鍚庯紝鎸夌収浣跨敤鑰呯殑瑕佹眰鍚姩杞崲榪囩▼銆?/span>
1銆?/span>
浣滀負涓涓?/span>
Singleton
瀹炵幇錛?/span>
榪欑鏂瑰紡鐨勮鏄庡皢鍦ㄨ鍒?/span>
Singleton
鑼冨紡琛ュ厖銆?/span>
2銆?/span>
鍒涘緩緋誨垪浜у搧錛?/span>
鍦ㄨ繖縐嶆柟寮忎笅鍙堝寘鍚袱縐嶅瓙鏂瑰紡錛?/span>
a)聽聽聽聽聽聽聽
浣跨敤
Factory Method
鑼冨紡錛?/span>
綆鍗曞湴璇達紝浣跨敤榪欑鏂瑰紡鐨勫疄鐜板氨鏄畾涔変竴涓帴鍙o紝閽堝鑷繁瀹氫箟鐨勪駭鍝侊紙
widget
錛夐泦鍚堜腑姣忎釜綾誨瀷瀹氫箟涓涓垱寤烘柟娉曪紝騫跺湪鍏跺瓙綾諱腑鎻愪緵瀹炵幇銆?/span>
b)聽聽聽聽聽聽聽
浣跨敤
Prototype
鑼冨紡錛?/span>
鍘熸枃
Implementation
閮ㄥ垎
錛?/span>
鈥?/span>
The concrete factory is initialized with a prototypical instance of each product in the family, and it creates a new product by cloning its prototype
.
鈥?/span>
榪欏彞璇濈殑鎰忔濇槸璇達紝瀵瑰湪鍚屼竴涓駭鍝佺皣鐨勪駭鍝侊紝褰撳畠浠殑宸ュ巶琚疄渚嬪寲鏃訛紝瀹冧滑鍚屾椂涔熻瀹炰緥鍖栧埌榪欎釜宸ュ巶涓紝騫跺湪瀹㈡埛闇瑕佸叾涓煇涓被鍨嬬殑浜у搧瀹炰緥鏃訛紝浣跨敤
clone
鏂瑰紡鍒涘緩涓涓柊鐨勫璞$粰瀹㈡埛銆?/span>
鍘熸湰
Implementation
閮ㄥ垎
錛?/span>
鈥?/span>
The Prototype-based approach eliminates the need for a new concrete factory class for each new product family
.
鈥濊繖鍙ヨ瘽鏄笂鍙ュ紩鏂囩殑涓嬩竴鍙ャ?/span>
鎴戜釜浜鴻涓猴紝榪欏彞璇濈殑鏈剰鏄拡瀵?/span>
a
錛夋柟娉曡岃█鐨勶紱浣嗗嵈涓庡畠鐨勪笂涓鍙ヨ瘽鐩鎬簰鐭涚浘銆傚洜涓轟笂涓鍙ヨ榪欎釜鏂規硶鏄拡瀵光?/span>
in the family
鈥濈殑錛岃屾湰鍙ユ槸閽堝鈥?/span>
a new concrete factory
鈥濆拰鈥?/span>
new product family
鈥濈殑銆傜◢寰湁鐐硅嫳璇父璇嗙殑浜洪兘鐭ラ亾錛屸?/span>
the
鈥濇槸瀹氬啝璇嶏紝涓鑸敤浜庣壒鎸囷紱鑰屸?/span>
a
鈥濆湪榪欓噷琛ㄧず浠繪剰銆傚洜姝ゆ垜璁や負鏄涓嶉氱殑錛屾崲鍙ヨ瘽璇達紝浣跨敤鍩轟簬
Prototype
鐨勫疄鐜頒粛鐒朵笉鑳芥秷闄や竴涓叿浣撶殑宸ュ巶閽堝涓涓叿浣撲駭鍝佺皣鐨勯檺鍒躲傚嵆浣垮彲浠ワ紝涓鑸簲鐢ㄥ湪璇ヤ駭鍝侀泦鍚堝寘鍚緝灝戠殑浜у搧綾誨瀷鏃朵嬌鐢ㄣ?/span>
3銆?/span>
瀹氫箟鍙墿灞曠殑宸ュ巶錛?/span>
榪欑鏂瑰紡閽堝鑷繁瀹氫箟鐨勪駭鍝侊紙
widget
錛夐泦鍚堜笉鍙鐭ョ殑綾誨瀷鎵╁睍錛屾彁渚涗竴縐嶅彔鍔犵殑鏂瑰紡錛屼互渚挎墿灞曡嚜宸辯殑宸ュ巶鏉ョ敓浜ц鎵╁睍鐨勪駭鍝佺被鍨嬨?/span>
鍘熸枃
Intent
閮ㄥ垎錛?/span>
鈥?/span>
鈥ithout specifying their concrete classes
鈥濓紝鍗沖浣跨敤榪欎釜瀵硅薄鐨勭敤鎴鳳紝涓嶇洿鎺ユ彁渚?/span>
new
鎿嶄綔錛?br />
涓涓璞$殑綾誨瀷鏀寔澶氱鏍囧噯錛涘茍婊¤凍鐢ㄦ埛鍦ㄥ縐嶆爣鍑嗕箣闂磋嚜鐢卞湴浠庝竴縐嶆爣鍑嗚漿鎹㈡垚鍙﹀涓縐嶆爣鍑嗐?/span>
涓轟簡瀹炵幇榪欎釜鑼冨紡錛岄渶瑕佷負灝嗚瀹炵幇鐨?/span>
widget
闆嗗悎瀹氫箟涓涓葷殑宸ュ巶鎶借薄綾伙紝鍗籌細
AbstractFactory
錛屽悓鏃跺湪榪欎釜宸ュ巶綾諱腑涓烘瘡涓?/span>
widget
瀹氫箟涓涓被浼間簬
CreateXXX
錛?/span>
Create
琛ㄧず瑕佹墽琛岀殑媧誨姩錛?/span>
XXX
琛ㄧず琚垱寤虹殑
widget
鐨勭被鍨嬪悕縐幫級鐨勬柟娉曪紱騫跺瑕佸疄鐜扮殑
widget
闆嗗悎涓殑姣忎釜
widget
瀹氫箟涓涓娊璞$被銆?/span>
鍘熸枃
Motivation
閮ㄥ垎錛?/span>
鈥?/span>
There鈥檚 also an abstract class for each kind of widget, and concrete subclasses implement widgets for specific look-and-feel standards.
鈥?/span>
聽
鐢變簬瀵瑰疄鐜版瘡涓爣鍑嗕笅鐨?/span>widget綾誨瀷闆嗗悎闇瑕佹彁渚涚浉搴旂殑WidgetFactory鐨勫疄鐜幫紝鍥犳鐢ㄦ埛闇瑕佸疄渚嬪寲姣忎釜鏍囧噯涓嬬殑宸ュ巶瀹炵幇銆?br />
涓鴻В鍐寵繖涓棶棰橈紝鍦?/span>Java涓瓨鍦ㄥ吀鍨嬬殑瀹炵幇鏂瑰紡銆傚氨鏄畾涔変笂鍥劇殑涓婁竴閮ㄥ垎錛岀劧鍚庤嚜宸卞疄鐜頒竴涓綔涓洪粯璁ょ殑錛涚劧鍚庯紝鍦ㄦ煇涓湴鏂瑰疄鐜頒竴涓潤鎬佺殑鏂規硶錛屼互瀹炰緥鍖栫湡瀹炵殑WidgetFactory錛涙帴涓嬫潵緇欏簲鐢ㄥ紑鍙戜漢鍛樻彁渚涗竴涓爣鍑嗙殑緋葷粺灞炴э紝姣斿-Djava.widget.factory=錛涜繖鏍峰彲瀹炵幇鐏墊椿鐨勬挙鎹€?/span>