最近在又細讀了一遍《大話設計模式》之後,對其中提到的3種工廠模式有些概念和使用上的模糊,因此結合書中講解和碼友們的資料,自我總結一下,供以後複習時參考。「工廠」二字,其含義是使用工廠(乙個或一系列方法)去生產產品(乙個或一系列類的例項)。
有時候,我們常常會將生產產品的乙個或一系列方法封裝到乙個類中,我習慣把這個類叫做「工廠類」;而被例項化的類稱作「產品類」。
uml類圖:
工廠類(******factory)擁有乙個工廠方法(create),接受了乙個引數,通過不同的引數例項化不同的產品類。
優點:
(1)很明顯,簡單工廠的特點就是「簡單粗暴」,通過乙個含參的工廠方法,我們可以例項化任何產品類,上至飛機火箭,下至土豆麵條,無所不能。所以簡單工廠有乙個別名:上帝類。
(2)簡單工廠包含必要的判斷邏輯,簡單工廠實現了物件的建立和使用的分離。
(3)客戶端無需知道所建立的具體產品類的類名,只需要具體產品類對應的引數即可!
(4)在不修改任何客戶端**的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性
缺點:
(1)任何」東西「的子類都可以被生產,負擔太重。當所要生產產品種類非常多時,工廠方法的**量可能會很龐大。
(2)在遵循開閉原則(對拓展開放,對修改關閉)的條件下,簡單工廠對於增加新的產品,無能為力。因為增加新產品只能通過修改工廠方法來實現。
工廠方法正好可以解決簡單工廠的這兩個缺點。
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法模式使乙個類的例項化延遲到其子類。
優點:(1)工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由乙個工廠生產;(對應簡單工廠的缺點1)
(2)同時增加某一類」東西「並不需要修改工廠類,只需要新增生產這類」東西「的工廠即可,使得工廠類符合開放-封閉原則。
缺點:(1)相比簡單工廠,實現略複雜。
(2)對於某些可以形成產品族的情況處理比較複雜。
(3)抽象層的加入使得理解程度加大
對於缺點(2),我們可以借用抽象工廠來實現。
提供乙個建立一系列相關或相互依賴的物件的介面,而無需指定他們具體的類。
優點:(1)易於交換產品系列,改變乙個應用的具體工廠變的特別容易,只需要改變具體工廠則可以使用不同的產品配置生產出對應的產品。
(2)具體建立例項的過程與客戶端分離,客戶端通過他們的抽象介面操縱例項。
(3)針對產品族;
缺點:針對產品族。
所以,只有對應產品族的情況下,才需要使用抽象工廠模式。
簡單工廠 : 用來生產同一等級結構中的任意產品。(不支援拓展增加產品)
工廠方法 :用來生產同一等級結構中的固定產品。(支援拓展增加產品)
抽象工廠 :用來生產不同產品族的全部產品。(不支援拓展增加產品;支援增加產品族)
(1)工廠類常常採用單例模式(singleton)。
(2)工廠類擁有基類(定義共同介面),基類可以為純虛類,也可以定義預設方法。
(3)對於工廠方法和抽象工廠,基類中的生產產品的函式常常為虛函式,以實現動態繫結。
(4)呼叫工廠方法的函式通常採用工廠實現的指標和引用作為形參,以便根據不同的工廠實參呼叫不同的工廠方法。
簡單工廠,工廠方法,抽象工廠
簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。本文是本人對這三種模式學習後的乙個小結以及對他們之間的區別的理解。簡單工廠 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的引數的不同來返回不...
簡單工廠 工廠方法 抽象工廠
簡單工廠 乙個工廠類 根據傳入的參量決定建立出哪一種產品類的例項 直接乙個工廠類,內部通過 swith operator add類實現該介面 adddao implements dao dao的實現類 客戶端 dao dao new adddao dao.createoper 產生物件 這樣如果需要...
簡單工廠 工廠方法 抽象工廠
一 簡單工廠 factory 集中管理物件的產生,業務 只需要呼叫相應的方法,傳入不同的引數區分物件,就能得到想要的物件了 把業務 和對應的物件解耦 建立乙個抽象類 public abstract class cellphone public abstract void show 建立實現抽象類的實...