日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

老生常谈:抽象工厂模式

發(fā)布時(shí)間:2023/11/30 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老生常谈:抽象工厂模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 在創(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。?

Code

??

???第三:具體工廠部分,我在這稱為: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。