幾種工廠模式的區別

  簡單工廠模式,工廠方法模式和抽象工廠模式都是屬於建立型設計模式,這三種建立型模式都不須要知道具體類。咱們掌握一種思想,就是在建立一個對象時,須要把容易發生變化的地方給封裝起來,來控制變化(哪裏變化,封裝哪裏),以適應客戶的變更,項目的擴展。用這三種設計模式均可以實現,那究竟這三種設計模式有什麼異同呢?下面根據這三者之間的特色,優勢,缺點,適用範圍進行比較。設計模式

特色

  簡單工廠模式:專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備 共同的父類。它又稱爲靜態工廠方法模式。它的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類(這些產品類繼承自一個父類或接口)的實例。簡單工廠模式的建立目標,全部建立的對象都是充當這個角色的某個具體類的實例。在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,可以根據外界給定的信息,決定究竟應該建立哪一個具體類的對象。用戶在使用時能夠直接根據工廠類去建立所需的實例,而無需瞭解這些對象是如何建立以及如何組織的。有利於整個軟件體系結構的優化。優化

  工廠方法模式:工廠方法是粒度很小的設計模式,由於模式的表現只是一個抽象的方法。 提早定義用於建立對象的接口,讓子類決定實例化具體的某一個類,即在工廠和產品中間增長接口,工廠再也不負責產品的建立,由接口針對不一樣條件返回具體的類實例,由具體類實例去實現。工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先徹底實現‘開-閉 原則’,實現了可擴展。其次實現更復雜的層次結構,能夠應用於產品結果複雜的場合。工廠方法模式是對簡單工廠模式進行了抽象。有一個抽象的Factory類(能夠是抽象類和接口),這個類將不在負責具體的產品生產,而是隻制定一些規範,具體的生產工做由其子類去完成。在這個模式中,工廠類和產品類每每能夠依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。spa

  抽象工廠模式:抽象工廠模式是全部形態的工廠模式中最爲抽象和最具通常性的一 種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體的狀況下,建立多個產品族中的產品對象。它有多個抽象產品類,每一個抽象產品類能夠派生出多個具體產品類,一個抽象工廠類,能夠派生出多個具體工廠類,每一個具體工廠類能夠建立多個具體產品類的實例。每個模式都是針對必定問題的解決方案,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是多個產品等級結果。設計

優勢

  簡單工廠模式:工廠類含有必要的判斷邏輯,能夠決定在何時建立哪個產品類的實 例,客戶端能夠免除直接建立產品對象的責任,而僅僅"消費"產品。簡單工廠模式經過這種作法實現了對責任的分割。簡單工廠模式可以根據外界給定的信息,決定究竟應該建立哪一個具體類的對象。經過它,外界能夠從直接建立具體產品對象的尷尬局面中擺脫出來。外界與具體類隔離開來,偶合性低。明確區分了各自的職責和權力,有利於整個軟件體系結構的優化。代理

  工廠方法模式:工廠方法模式是爲了克服簡單工廠模式的缺點(主要是爲了知足OCP)而 設計出來的。簡單工廠模式的工廠類隨着產品類的增長鬚要增長不少方法(或代碼),而工廠方法模式每一個具體工廠類只完成單一任務,代碼簡潔。工廠方法模式徹底知足OCP,即它有很是良好的擴展性。對象

  抽象工廠模式:抽象工廠模式主要在於應對「新系列」的需求變化。分離了具體的類,抽 象工廠模式幫助你控制一個應用建立的對象的類,由於一個工廠封裝建立產品對象的責任和過程。它將客戶和類的實現分離,客戶經過他們的抽象接口操縱實例,產品的類名也在具體工廠的實現中被分離,它們不出如今客戶代碼中。它使得易於交換產品系列。一個具體工廠類在一個應用中僅出現一次——即在它初始化的時候。這使得改變一個應用的具體工廠變得很容易。它只需改變具體的工廠便可使用不一樣的產品配置,這是由於一個抽象工廠建立了一個完整的產品系列,因此整個產品系列會馬上改變。它有利於產品的一致性。當一個系列的產品對象被設計成一塊兒工做時,一個應用一次只能使用同一個系列中的對象,這一點很重要,而抽象工廠很容易實現這一點。抽象工廠模式有助於這樣的團隊的分工,下降了模塊間的耦合性,提升了團隊開發效率。繼承

缺點

  簡單工廠模式:當產品有複雜的多層等級結構時,工廠類只有本身,以不變應萬變,就是模式的缺點。由於工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。系統擴展困難,一旦添加新產品就不得不修改工廠邏輯(若是要增長一個產品,則須要修改工廠類,增長if/else分支,或者增長一個case分支),有可能形成工廠邏輯過於複雜,違背了"開放--封閉"原則(OCP).另外,簡單工廠模式一般使用靜態工廠方法,這使得沒法由子類繼承,形成工廠角色沒法造成基於繼承的等級結構。接口

  工廠方法模式:不易於維護,假如某個具體產品類須要進行必定的修改,極可能須要修改對應的工廠類。當同時須要修改多個產品類的時候,對工廠類的修改會變得至關麻煩(對號入座已是個問題了)。資源

  抽象工廠模式:抽象工廠模式在於難於應付「新對象」的需求變更。難以支持新種類的產品。難以擴展抽象工廠以生產新種類的產品。這是由於抽象工廠幾乎肯定了能夠被建立的產品集合,支持新種類的產品就須要擴展該工廠接口,這將涉及抽象工廠類及其全部子類的改變。開發

適用範圍

  簡單工廠模式:工廠類負責建立的對象比較少,客戶只知道傳入了工廠類的參數,對 於始何建立對象(邏輯)不關心。

  工廠方法模式:當一個類不知道它所必須建立對象的類或一個類但願由子類來指定它所建立的對象時,當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候,可使用工廠方法。

  抽象工廠模式:一個系統不該當依賴於產品類實例如何被建立、組合和表達的細節,這對於全部形態的工廠模式都是重要的。這個系統有多於一個的產品族,而系統只消費其中某一產品族。同屬於同一個產品族的產品是在一塊兒使用的,這一約束必須在系統的設計中體現出來。系統提供一個產品類的庫,全部的產品以一樣的接口出現,從而使客戶端不依賴於實現。

  其實,不管是簡單工廠模式、工廠模式仍是抽象工廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留做接口,以達到最大程度上的複用。究竟用哪一種設計模式更適合,這要根據具體的業務需求來決定。

  另外,附上一個關於這幾種工廠模式的比喻。不管是簡單工廠模式、工廠模式仍是抽象工廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留做接口,以達到最大程度上的複用。拿一個生產水杯(cup)的工廠舉例:起初,不用工廠模式,我必須在生產水杯以前知道水杯的材料和形狀等水杯的全部特徵才能生產,這就是咱們的new Cup();這個Cup必須是具體的。廠主發現同一形狀的被子,只是材料不一樣,如一個是玻璃(glass)的,一個是瓷(china)的,可是確要兩條生產線,顯然有資源浪費的嫌疑。如今廠主生產杯子時先不讓生產線知道我要產的是玻璃的仍是瓷的,而是讓它在不知道具體材料的狀況下先作它能作的,等到它把模具作好,只須要向其中填充玻璃原料或者瓷原料就能夠造出同一形狀的具體杯子了。可是很惋惜,C#並不能new一個抽象的Cup,因此就有了簡單工廠模式。原來是Cup cup=new Cup;如今是SimpleCupFactory.createCup(String cupName),根據cup的名字生產Cup,而createCup返回的是一個實現了 Cup接口或抽象類的具體Cup。簡單抽象工廠模式有一個問題,就是當我如今想生產一個一樣形狀的鐵杯時,工廠裏並無定義相應的處理流程,只能更改createCup方法,這就不合理了。我如今只是想生產鐵杯,你只要在最後的時候把玻璃原料換成鐵的不就好了嗎,幹嗎還要更改整條生產線呢?因而就有了工廠模式。原來生產線在生產模具的時候還要考慮是爲玻璃杯生產的模具仍是爲鐵杯生產的模具,如今它不用管了。CupFactory.createCup()建立Cup.CupFactory是接口或抽象類。實現它的具體子類會建立符合Cup接口的具體Cup。那麼如今廠主想要生產水壺(kettle),用工廠模式就不得再也不造一條水壺生產線,能不能在水杯生產線同時生產水壺呢?這就是抽象工廠模式。

相關文章
相關標籤/搜索