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