時(shí)間:1月1日地點(diǎn):大B房間人物:大B,校
大B:“我們可以認(rèn)爲(wèi)麥當(dāng)勞和肯德基就是生產(chǎn)食物的工廠,那麼理所當(dāng)然,漢堡和雞腿是他們共同生產(chǎn)的兩種食物,不管你去MDL還是KDJ,說(shuō):我要雞腿,那肯定不會(huì)給你拿來(lái)烤羊腿。嘿嘿!這裡,我們假定麥當(dāng)勞和肯德基只生產(chǎn)這兩種產(chǎn)品。我們是消費(fèi)者,我們就是客戶,就是產(chǎn)品的消費(fèi)者,就是程序中對(duì)象的調(diào)用者。而麥當(dāng)勞和肯德基,理所當(dāng)然的,他們就是工廠,一個(gè)叫做麥當(dāng)勞工廠,一個(gè)叫做肯德基工廠,他們是真正的生產(chǎn)者,而對(duì)於我們這些客戶消費(fèi)者(程序中對(duì)象的調(diào)用者)來(lái)說(shuō),不管是去麥當(dāng)勞還是肯德基,我們都說(shuō)一樣的話(我們的要求是穩(wěn)定的):我要雞腿。只要我們提出這個(gè)請(qǐng)求,那麼肯定會(huì)得到我們想要的。而作爲(wèi)工廠(生產(chǎn)者),麥當(dāng)勞和肯德基都生產(chǎn)雞腿和漢堡,所以抽象出來(lái)的抽象工廠都具有生產(chǎn)雞腿和生產(chǎn)漢堡的功能,這是接口中的兩個(gè)方法。因爲(wèi)在這個(gè)接口中,還不知道到底要生產(chǎn)誰(shuí)家的產(chǎn)品,所以只能返回個(gè)抽象的雞腿或漢堡,等到麥當(dāng)勞或者肯德基工廠生產(chǎn)出來(lái),就知道是誰(shuí)家的了。(有標(biāo)誌嘛,這就是動(dòng)態(tài)創(chuàng)建對(duì)象)。不管是麥當(dāng)勞還是肯德基的雞腿或漢堡,它的本質(zhì)都是雞腿或漢堡,所以可以抽象出來(lái)。那麼雞腿就派生出麥當(dāng)勞的雞腿和肯德基的雞腿,而漢堡就派生出麥當(dāng)勞的漢堡和肯德基的漢堡。而對(duì)於我們這些客戶消費(fèi)者(程序中對(duì)象的調(diào)用者)來(lái)說(shuō),不管是去麥當(dāng)勞還使肯德基,我們都說(shuō)一樣的話(我們的要求是穩(wěn)定的):我要雞腿。只要我們提出這個(gè)要求,那麼肯定會(huì)得到我們想要的。不管是誰(shuí)家的雞腿,肯定是雞腿不會(huì)是羊腿。所以,我們只要規(guī)定好是雞腿(接口)就行了,而讓工廠去絕對(duì)具體的製作過(guò)程。我們只伸手接過(guò)來(lái)一個(gè)雞腿,狠狠的咬一口,恩,真香!)到現(xiàn)在爲(wèi)止,我們只和雞腿(抽象的接口)還有抽象工廠(因爲(wèi)我們不管是麥當(dāng)勞還是肯德基,我們只要雞腿)打交道。你現(xiàn)在知不知道什麼是抽象工廠模式?”
小A:“抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類。抽象工廠(AbstractFactory)模式,又稱工具箱(Kit或Toolkit)模式。”
大B:“從模式定義中知道這個(gè)模式的意圖內(nèi)容爲(wèi):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類。工廠類層次的通信接口只有抽象工廠和創(chuàng)建產(chǎn)品族的各個(gè)工廠方法,這些工廠方法不帶任何參數(shù),並且返回具有抽象產(chǎn)品類型的具體產(chǎn)品實(shí)例。這些使得客戶端可以不依賴具體產(chǎn)品的類,從而體現(xiàn)了模式的意圖。意圖中的‘而無(wú)需指定它們具體的類’可以理解爲(wèi)客戶端在使用和創(chuàng)建具體產(chǎn)品時(shí)不給出具體產(chǎn)品的任何暗示。”
小A:“師兄,抽象工廠模式有什麼動(dòng)機(jī)啊?”
大B:“考慮一個(gè)支持多種視感(look-and-feel)標(biāo)準(zhǔn)的用戶界面工具包,例如Motif和PresentationManager。不同的視感風(fēng)格爲(wèi)諸如滾動(dòng)條、窗口和按鈕等用戶界面‘窗口組件’定義不同的外觀和行爲(wèi)。爲(wèi)保證視感風(fēng)格標(biāo)準(zhǔn)間的可移植性,一個(gè)應(yīng)用不應(yīng)該爲(wèi)一個(gè)特定的視感外觀硬編碼它的窗口組件。在整個(gè)應(yīng)用中實(shí)例化特定視感風(fēng)格的窗口組件類將使得以後很難改變視感風(fēng)格。”