老生常谈:抽象工厂模式
? ? 在創(chuàng)建型模式中有一個模式是不得不學的,那就是抽象工廠模式(Abstract Factory),這是創(chuàng)建型模式中最為復雜,功能最強大的模式.它常與工廠方法組合來實現(xiàn)。平時我們在寫一個組件的時候一般只針對一種語言,或者說是針對一個區(qū)域的人來實現(xiàn)。?
????例如:現(xiàn)有有一個新聞組件,在中國我們有這樣的需求:在顯示新聞列表的同時,附加一個操作:例如給新聞的人氣加一。這種需求是非常容易實現(xiàn)的,可是有朝一日你的這個新聞組件應用到了美國呢。你的功能還能滿足當?shù)氐男枨髥?此時美國的需求是:在顯示新聞列表的同時,把這條新聞加入到某個RSS中去。可想,不做修改直接用是不行的,那如果直接修改類方法呢?這樣實際也是可行的,但是違背了"開-閉"的編程原則,不便以后的維護。 那不修改就只有新加類了,我們可以保留原有功能的同時增加一批類,方法簽名都同于之前的,只是實現(xiàn)方式不同而已。為什么要這樣做呢?本人的思路是這樣的:
??? 新聞組件無非可以分為兩塊:?
????第一:讀取新聞,這是固定不變的,所以可以抽象出來。?
????第二:讀取新聞同時的附加操作,可以有,也可以沒有,可以有一種操作也可以是多種,這里我可以把它們都封閉進一個方法中.這樣在外界看起來就是調用了一個方法。所以也可以抽象出來。?
??? 結論:這種情況就是抽象工廠中的系列產品了,生成產品的流程基本都一樣,不同的是生產過程。我對新聞組件的改造,具體實現(xiàn)過程如下:先貼出類圖:
??
?
??????第一:所謂工廠肯定是要有一個最上層的管理工廠了,這里我稱為parentFactory,它下面有兩個子工廠,我稱為:childFactory,分別是負責美國和中國的childFactory_China和childFactory_US。parentFactory的責任就是管理好這兩個子工廠。生產子工廠實例的方法我用了反射的原理,這樣可以在web.config文件中配置就可以決定調用哪一個子工廠來生產產品了。??
Code??????
??????web.config文件中的配置節(jié):
Code
????第二:完成負責美國和中國的childFactory_China和childFactory_US兩個子工廠,它們的功能都是一樣的,找到合適的工廠(我在這稱為:concreteFactory)來完成兩個具體部件的加工工作,這兩個部件分別是:1讀取新聞部件,2:讀取新聞后進行的額外操作的部件。這里以中國境內的子工廠為倒來說明:childFactory_China:這個子工廠主要是"找到"具體生產產品的工廠,我在這稱為:concreteFactory。?
??
???第三:具體工廠部分,我在這稱為:concreteFactory,它們負責生成出具體的產品來,對應上面的新聞組件,就是負責生成:1能夠讀取新聞的部件,2:讀取新聞后能夠進行相應操作的部件。我在這稱為concreteProduct,最終產品。這里就說明一下中國境內的具體工廠的類實現(xiàn)代碼,其它的就省略了。
??? 1:getNews_Class_China:讀取新聞部件的具體工廠:
Code?
????2:otherOperationClass_China:讀取新聞后進行附加操作部件的具體工廠.
Code??
???第四:有了產品當然少不了消費者了,這里我稱為customer,customer只與parentFactory和concreteProduc有直接關系,customer可以指定調用哪一個系列的產品。
?
???第五:頁面代碼:把新聞列表綁定到控件中,同時為了說明問題,把customer在綁定新聞時的附加操作內容以文本的形式顯示出來.?
Code?
?? cs:
Code?
????第六:運行效果:
?????本例有點就模式而模式的意思,其實本人也只是模式的初學者,很難把在實際當中的模式應用拿出來講,說實在的,本人應用模式特別少。就上面的需求其實有非常多的方法可以實現(xiàn),只是各有所長而已。在前一段時間,本人學習裝飾者模式的時候,就根據(jù)同樣的需求用裝飾者實現(xiàn)過,效果也不錯。在網站新聞模塊中應用裝飾者模式?有興趣的朋友可以對比看看,不妥處望指教。
???? 在以下情況下應當考慮使用抽象工廠模式:本人在這就不獻丑了,直接引用.NET設計模式(3):抽象工廠模式(Abstract Factory),希望大家不要笑我懶啊? :)
??? 1:一個系統(tǒng)不應當依賴于產品類實例如何被創(chuàng)建、組合和表達的細節(jié),這對于所有形態(tài)的工廠模式都是重要的。
????2:這個系統(tǒng)有多于一個的產品族,而系統(tǒng)只消費其中某一產品族。
??? 3:同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統(tǒng)的設計中體現(xiàn)出來。
??? 4:系統(tǒng)提供一個產品類的庫,所有的產品以同樣的接口出現(xiàn),從而使客戶端不依賴于實現(xiàn)。
???總結:在本例中,我們發(fā)現(xiàn)抽象工廠雖然能夠非常完美的滿足需求,但是也有缺點:難以擴展抽象工廠以生產新種類的產品。所有的子工廠都是事先安排好的,如果要生成一個全新的系列產品還是要修改類。?
注:
??? 本文引用:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html
?
轉載于:https://www.cnblogs.com/zhanglixina/p/7776729.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的老生常谈:抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 连接sqlexpress
 - 下一篇: 变量名和变量地址