? ? 在創建型模式中有一個模式是不得不學的,那就是抽象工廠模式(Abstract Factory),這是創建型模式中最為復雜,功能最強大的模式.它常與工廠方法組合來實現。平時我們在寫一個組件的時候一般只針對一種語言,或者說是針對一個區域的人來實現。?
????例如:現有有一個新聞組件,在中國我們有這樣的需求:在顯示新聞列表的同時,附加一個操作:例如給新聞的人氣加一。這種需求是非常容易實現的,可是有朝一日你的這個新聞組件應用到了美國呢。你的功能還能滿足當地的需求嗎?此時美國的需求是:在顯示新聞列表的同時,把這條新聞加入到某個RSS中去。可想,不做修改直接用是不行的,那如果直接修改類方法呢?這樣實際也是可行的,但是違背了"開-閉"的編程原則,不便以后的維護。 那不修改就只有新加類了,我們可以保留原有功能的同時增加一批類,方法簽名都同于之前的,只是實現方式不同而已。為什么要這樣做呢?本人的思路是這樣的:
??? 新聞組件無非可以分為兩塊:?
????第一:讀取新聞,這是固定不變的,所以可以抽象出來。?
????第二:讀取新聞同時的附加操作,可以有,也可以沒有,可以有一種操作也可以是多種,這里我可以把它們都封閉進一個方法中.這樣在外界看起來就是調用了一個方法。所以也可以抽象出來。?
??? 結論:這種情況就是抽象工廠中的系列產品了,生成產品的流程基本都一樣,不同的是生產過程。我對新聞組件的改造,具體實現過程如下:先貼出類圖:
??
?
??????第一:所謂工廠肯定是要有一個最上層的管理工廠了,這里我稱為parentFactory,它下面有兩個子工廠,我稱為:childFactory,分別是負責美國和中國的childFactory_China和childFactory_US。parentFactory的責任就是管理好這兩個子工廠。生產子工廠實例的方法我用了反射的原理,這樣可以在web.config文件中配置就可以決定調用哪一個子工廠來生產產品了。??

???
??????web.config文件中的配置節:

????第二:完成負責美國和中國的childFactory_China和childFactory_US兩個子工廠,它們的功能都是一樣的,找到合適的工廠(我在這稱為:concreteFactory)來完成兩個具體部件的加工工作,這兩個部件分別是:1讀取新聞部件,2:讀取新聞后進行的額外操作的部件。這里以中國境內的子工廠為倒來說明:childFactory_China:這個子工廠主要是"找到"具體生產產品的工廠,我在這稱為:concreteFactory。?

??
???第三:具體工廠部分,我在這稱為:concreteFactory,它們負責生成出具體的產品來,對應上面的新聞組件,就是負責生成:1能夠讀取新聞的部件,2:讀取新聞后能夠進行相應操作的部件。我在這稱為concreteProduct,最終產品。這里就說明一下中國境內的具體工廠的類實現代碼,其它的就省略了。
??? 1:getNews_Class_China:讀取新聞部件的具體工廠:

?
????2:otherOperationClass_China:讀取新聞后進行附加操作部件的具體工廠.

??
???第四:有了產品當然少不了消費者了,這里我稱為customer,customer只與parentFactory和concreteProduc有直接關系,customer可以指定調用哪一個系列的產品。
?
???第五:頁面代碼:把新聞列表綁定到控件中,同時為了說明問題,把customer在綁定新聞時的附加操作內容以文本的形式顯示出來.?

?
?? cs:

?
????第六:運行效果:
?????本例有點就模式而模式的意思,其實本人也只是模式的初學者,很難把在實際當中的模式應用拿出來講,說實在的,本人應用模式特別少。就上面的需求其實有非常多的方法可以實現,只是各有所長而已。在前一段時間,本人學習裝飾者模式的時候,就根據同樣的需求用裝飾者實現過,效果也不錯。在網站新聞模塊中應用裝飾者模式?有興趣的朋友可以對比看看,不妥處望指教。
???? 在以下情況下應當考慮使用抽象工廠模式:本人在這就不獻丑了,直接引用.NET設計模式(3):抽象工廠模式(Abstract Factory),希望大家不要笑我懶啊? :)
??? 1:一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有形態的工廠模式都是重要的。
????2:這個系統有多于一個的產品族,而系統只消費其中某一產品族。
??? 3:同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
??? 4:系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴于實現。
???總結:在本例中,我們發現抽象工廠雖然能夠非常完美的滿足需求,但是也有缺點:難以擴展抽象工廠以生產新種類的產品。所有的子工廠都是事先安排好的,如果要生成一個全新的系列產品還是要修改類。?
注:
??? 本文引用:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html
?