老生常談:抽象工廠模式

? ? 在創建型模式中有一個模式是不得不學的,那就是抽象工廠模式(Abstract Factory),這是創建型模式中最為復雜,功能最強大的模式.它常與工廠方法組合來實現。平時我們在寫一個組件的時候一般只針對一種語言,或者說是針對一個區域的人來實現。?

????例如:現有有一個新聞組件,在中國我們有這樣的需求:在顯示新聞列表的同時,附加一個操作:例如給新聞的人氣加一。這種需求是非常容易實現的,可是有朝一日你的這個新聞組件應用到了美國呢。你的功能還能滿足當地的需求嗎?此時美國的需求是:在顯示新聞列表的同時,把這條新聞加入到某個RSS中去。可想,不做修改直接用是不行的,那如果直接修改類方法呢?這樣實際也是可行的,但是違背了"開-閉"的編程原則,不便以后的維護。 那不修改就只有新加類了,我們可以保留原有功能的同時增加一批類,方法簽名都同于之前的,只是實現方式不同而已。為什么要這樣做呢?本人的思路是這樣的:

??? 新聞組件無非可以分為兩塊:?

????第一:讀取新聞,這是固定不變的,所以可以抽象出來。?

????第二:讀取新聞同時的附加操作,可以有,也可以沒有,可以有一種操作也可以是多種,這里我可以把它們都封閉進一個方法中.這樣在外界看起來就是調用了一個方法。所以也可以抽象出來。?

??? 結論:這種情況就是抽象工廠中的系列產品了,生成產品的流程基本都一樣,不同的是生產過程。我對新聞組件的改造,具體實現過程如下:先貼出類圖:


??

?

??????第一:所謂工廠肯定是要有一個最上層的管理工廠了,這里我稱為parentFactory,它下面有兩個子工廠,我稱為:childFactory,分別是負責美國和中國的childFactory_China和childFactory_US。parentFactory的責任就是管理好這兩個子工廠。生產子工廠實例的方法我用了反射的原理,這樣可以在web.config文件中配置就可以決定調用哪一個子工廠來生產產品了。??

Code???

???

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

Code


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

Code

??

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

??? 1:getNews_Class_China:讀取新聞部件的具體工廠:

Code

?

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

Code

??

???第四:有了產品當然少不了消費者了,這里我稱為customer,customer只與parentFactory和concreteProduc有直接關系,customer可以指定調用哪一個系列的產品。

?

???第五:頁面代碼:把新聞列表綁定到控件中,同時為了說明問題,把customer在綁定新聞時的附加操作內容以文本的形式顯示出來.?

Code

?

?? cs:

Code

?

????第六:運行效果:

?????本例有點就模式而模式的意思,其實本人也只是模式的初學者,很難把在實際當中的模式應用拿出來講,說實在的,本人應用模式特別少。就上面的需求其實有非常多的方法可以實現,只是各有所長而已。在前一段時間,本人學習裝飾者模式的時候,就根據同樣的需求用裝飾者實現過,效果也不錯。在網站新聞模塊中應用裝飾者模式?有興趣的朋友可以對比看看,不妥處望指教。

???? 在以下情況下應當考慮使用抽象工廠模式:本人在這就不獻丑了,直接引用.NET設計模式(3):抽象工廠模式(Abstract Factory),希望大家不要笑我懶啊? :)

??? 1:一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有形態的工廠模式都是重要的。

????2:這個系統有多于一個的產品族,而系統只消費其中某一產品族。

??? 3:同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

??? 4:系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴于實現。

???總結:在本例中,我們發現抽象工廠雖然能夠非常完美的滿足需求,但是也有缺點:難以擴展抽象工廠以生產新種類的產品。所有的子工廠都是事先安排好的,如果要生成一個全新的系列產品還是要修改類。?

注:

??? 本文引用:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html

?

轉載于:https://www.cnblogs.com/zhanglixina/p/7776729.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390928.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ogc是一個非營利性組織_非營利組織的軟件資源

ogc是一個非營利性組織Please note that freeCodeCamp is not partnered with, nor do we receive a referral fee from, any of the following providers. We simply want to help guide you toward a solution for your organization.請注意,freeCodeCamp不與以下…

數據結構入門最佳書籍_最佳數據科學書籍

數據結構入門最佳書籍Introduction介紹 I get asked a lot what resources I recommend for people who want to start their Data Science journey. This section enlists books I recommend you should read at least once in your life as a Data Scientist.我被很多人問到…

函數式編程概念

什么是函數式編程 簡單地說,函數式編程通過使用函數,將值轉換成抽象單元,接著用于構建軟件系統。 面向對象VS函數式編程 面向對象編程 面向對象編程認為一切事物皆對象,將現實世界的事物抽象成對象,現實世界中的關系抽…

在Java里面怎么樣在靜態方法中調用getClass()?

問題:在Java里面怎么樣在靜態方法中調用getClass()? 我有一個類,它必須包含一些靜態方法,在這些靜態方法里面我需要像下面那樣調用getClass() 方法 public static void startMusic() {URL songPath getClass().getClassLoader(…

變量名和變量地址

變量名和變量地址 研一時,很偶然的翻開譚浩強老先生的《C程序設計》(是師姐的書,俺的老早就賣了,估計當時覺得這本書寫得不夠好),很偶然的看到關于變量名的一段話:“變量名實際上是一個符號地址…

多重插補 均值插補_Feature Engineering Part-1均值/中位數插補。

多重插補 均值插補Understanding the Mean /Median Imputation and Implementation using feature-engine….!了解使用特征引擎的均值/中位數插補和實現…。! 均值或中位數插補: (Mean or Median Imputation:) The mean or median value should be calc…

域 嵌入圖像顯示不出來_如何(以及為什么)將域概念嵌入代碼中

域 嵌入圖像顯示不出來Code should clearly reflect the problem it’s solving, and thus openly expose that problem’s domain. Embedding domain concepts in code requires thought and skill, and doesnt drop out automatically from TDD. However, it is a necessary …

linux 查看用戶上次修改密碼的日期

查看root用戶密碼上次修改的時間 方法一:查看日志文件: # cat /var/log/secure |grep password changed 方法二: # chage -l root-----Last password change : Feb 27, 2018 Password expires : never…

spring里面 @Controller和@RestController注解的區別

問題:spring里面 Controller和RestController注解的區別 spring里面 Controller和RestController注解的區別 Web MVC和REST applications都可以用Controller嗎? 如果是的話,怎么樣區別這個一個 Web MVC還是REST application呢 回答一 下面…

2流程控制

分支、循環 str1$1 str2$2 echo $# if [ $str1 $str2 ] thenecho "ab" elif [ "$str1" -lt "$str2" ] thenecho "a < b" elif [ "$str1" -gt "$str2" ] thenecho "a > b" elseecho "沒有符…

客戶行為模型 r語言建模_客戶行為建模:匯總統計的問題

客戶行為模型 r語言建模As a Data Scientist, I spend quite a bit of time thinking about Customer Lifetime Value (CLV) and how to model it. A strong CLV model is really a strong customer behavior model — the better you can predict next actions, the better yo…

linux bash命令_Ultimate Linux命令行指南-Full Bash教程

linux bash命令Welcome to our ultimate guide to the Linux Command Line. This tutorial will show you some of the key Linux command line technologies and introduce you to the Bash scripting language.歡迎使用我們的Linux命令行最終指南。 本教程將向您展示一些關鍵…

【知識科普】解讀閃電/雷電網絡,零基礎秒懂!

知識科普&#xff0c;解讀閃電/雷電網絡&#xff0c;零基礎秒懂&#xff01; 閃電網絡的技術是革命性的&#xff0c;將實現即時0手續費的小金額支付。第一步是解決擴容問題&#xff0c;第二部就是解決共通性問題&#xff0c;利用原子交換協議和不同鏈條的狀態通道結合&#xff…

spring框架里面applicationContext.xml 和spring-servlet.xml 的區別

問題&#xff1a;spring框架里面applicationContext.xml 和spring-servlet.xml 的區別 在Spring框架中applicationContext.xml和Spring -servlet.xml有任何關系嗎? DispatcherServlet可以使用到在applicationContext.xml中聲明的屬性文件嗎? 另外&#xff0c;為什么我需要*…

Alpha 沖刺 (5/10)

【Alpha go】Day 5&#xff01; Part 0 簡要目錄 Part 1 項目燃盡圖Part 2 項目進展Part 3 站立式會議照片Part 4 Scrum 摘要Part 5 今日貢獻Part 1 項目燃盡圖 Part 2 項目進展 已分配任務進度博客檢索功能&#xff1a;根據標簽檢索流程圖 -> 實現 -> 測試近期比…

多維空間可視化_使用GeoPandas進行空間可視化

多維空間可視化Recently, I was working on a project where I was trying to build a model that could predict housing prices in King County, Washington — the area that surrounds Seattle. After looking at the features, I wanted a way to determine the houses’ …

蠻力寫算法_蠻力算法解釋

蠻力寫算法Brute Force Algorithms are exactly what they sound like – straightforward methods of solving a problem that rely on sheer computing power and trying every possibility rather than advanced techniques to improve efficiency.蠻力算法聽起來確實像是–…

NoClassDefFoundError和ClassNotFoundException之間有什么區別?是由什么導致的?

問題&#xff1a; NoClassDefFoundError和ClassNotFoundException之間有什么區別?是由什么導致的&#xff1f; NoClassDefFoundError和ClassNotFoundException之前的區別是什么? 是什么導致它們被拋出?這些問題我們要怎么樣解決? 當我在為了引入新的jar包而修改現有代碼…

關于Tensorflow安裝opencv和pygame

1.安裝opencv https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv C:\ProgramData\Anaconda3\Lib\site-packages>pip install opencv_python-3.3.1-cp36-cp36m-win_amd64.whlProcessing c:\programdata\anaconda3\lib\site-packages\opencv_python-3.3.1-cp36-cp36m-win_a…

內置的常用協議實現模版

SuperSocket內置的常用協議實現模版 中文&#xff08;中國&#xff09;Toggle Dropdownv1.6Toggle Dropdown關鍵字: TerminatorReceiveFilter, CountSpliterReceiveFilter, FixedSizeReceiveFilter, BeginEndMarkReceiveFilter, FixedHeaderReceiveFilter 閱讀了前面一篇文檔之…