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