1. 簡單工廠模式
如何理解簡單工廠,工廠方法, 抽象工廠三種設計模式?
簡單工廠的生活場景,賣早點的小攤販,他給你提供包子,饅頭,地溝油烙的煎餅等,小販是一個工廠,它生產包子,饅頭,地溝油烙的煎餅。該場景對應的UML圖如下所示:
圖1:簡單工廠模式UML圖
簡單工廠模式的參與者:
工廠(Factory)角色:接受客戶端的請求,通過請求負責創建相應的產品對象。
抽象產品(Abstract Product)角色:是工廠模式所創建對象的父類或是共同擁有的接口。可是抽象類或接口。
具體產品(ConcreteProduct)對象:工廠模式所創建的對象都是這個角色的實例。
簡單工廠模式的演變:
1.)當系統中只有唯一的產品時,可以省略抽象產品,如圖1所示。這樣,工廠角色與具體產品可以合并。
簡單工廠模式的優缺點:
1.)工廠類含有必要的創建何種產品的邏輯,這樣客戶端只需要請求需要的產品,而不需要理會產品的實現細節。
2.)工廠類只有一個,它集中了所有產品創建的邏輯,它將是整個系統的瓶頸,同時造成系統難以拓展。
3.)簡單工廠模式通常使用靜態工廠方法,這使得工廠類無法由子類繼承,這使得工廠角色無法形成基于繼承的等級結構。
2.?工廠方法模式
工廠方法使用OOP的多態性,將工廠和產品都抽象出一個基類,在基類中定義統一的接口,然后在具體的工廠中創建具體的產品。工廠方法的生活場景,聯合利華要生產“夏士蓮”和“清揚”兩款洗發水,它會建一個生產“夏士蓮”的工廠和一個生產“清揚”的工廠。
圖2:工廠方法的UML圖
工廠方法模式中的參與者:
抽象工廠角色:與應用程序無關,任何在模式中創建對象的工廠必須實現這個接口。
具體工廠角色:實現了抽象工廠接口的具體類,含有與引用密切相關的邏輯,并且受到應用程序的調用以創建產品對象。
抽象產品角色:工廠方法所創建產品對象的超類型,也就是產品對象的共同父類或共同擁有的接口。
具體產品角色:這個角色實現了抽象產品角色所聲名的接口。工廠方法所創建的每個具體產品對象都是某個具體產品角色的實例。
工廠方法的優缺點:
1.)降低了工廠類的內聚,滿足了類之間的層次關系,又很好的符合了面向對象設計中的單一職責原則,這樣有利于程序的拓展,如圖三所示:
圖3:工廠方法的拓展UML圖
總結:把“共性”提取出來,根據各自的“個性”建立各自的繼承共性的實現
2?產品等級結構與產品族
在工廠方法模式中具體工廠負責生產具體的產品,每一個具體工廠對應一種具體產品,工廠方法具有唯一性,一般情況下,一個具體工廠中只有一個或者一組重載的工廠方法。但是有時候我們希望一個工廠可以提供多個產品對象,而不是單一的產品對象,如一個電器工廠,它可以生產電視機、電冰箱、空調等多種電器,而不是只生產某一種電器。為了更好地理解抽象工廠模式,我們先引入兩個概念:
(1)產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
(2)產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位于電視機產品等級結構中,海爾電冰箱位于電冰箱產品等級結構中,海爾電視機、海爾電冰箱構成了一個產品族。
產品等級結構與產品族示意圖如圖3所示:
圖3產品族與產品等級結構示意圖
在圖3中,不同顏色的多個正方形、圓形和橢圓形分別構成了三個不同的產品等級結構,而相同顏色的正方形、圓形和橢圓形構成了一個產品族,每一個形狀對象都位于某個產品族,并屬于某個產品等級結構。圖3中一共有五個產品族,分屬于三個不同的產品等級結構。我們只要指明一個產品所處的產品族以及它所屬的等級結構,就可以唯一確定這個產品。
當系統所提供的工廠生產的具體產品并不是一個簡單的對象,而是多個位于不同產品等級結構、屬于不同類型的具體產品時就可以使用抽象工廠模式。抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形式。抽象工廠模式與工廠方法模式最大的區別在于,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品對象的創建。當一個工廠等級結構可以創建出分屬于不同產品等級結構的一個產品族中的所有對象時,抽象工廠模式比工廠方法模式更為簡單、更有效率。抽象工廠模式示意圖如圖4所示:
圖4抽象工廠模式示意圖
在圖4中,每一個具體工廠可以生產屬于一個產品族的所有產品,例如生產顏色相同的正方形、圓形和橢圓形,所生產的產品又位于不同的產品等級結構中。如果使用工廠方法模式,圖4所示結構需要提供15個具體工廠,而使用抽象工廠模式只需要提供5個具體工廠,極大減少了系統中類的個數。
3. 抽象工廠設計模式
所謂抽象工廠是指一個工廠等級結構可以創建出分屬于不同產品等級結構的一個產品族中的所有對象,以創建Unix控件和Windows控件為例說明,我們需要一個抽象工廠下面有兩個子工廠,一個叫做UnixFactory,用于生產Unix族控件,一個叫做WinFactory,用于生產Win族控件。抽象工廠與工廠方法的區別是,工廠方法中的具體工廠一般只生產一個或幾個控件對象,而抽象工廠中的具體工廠生產的是一族控件對象。如圖4所示。
圖4:抽象工廠設計模式UML圖
抽象工廠中的參與者:
抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。
具體工廠(Concrete Factory)角色:這個角色直接在客戶端的調用下創建產品的實例。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
抽象產品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。
具體產品(Concrete Product)角色:抽象工廠模式所創建的任何產品對象都是某一個具體產品類的實例。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。
抽象工廠的使用場景:
一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有形態的工廠模式都是重要的。
這個系統有多于一個的產品族,而系統只消費其中某一產品族。
同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴于實現。
抽象工廠模式與工廠方法模式的區別
工廠方法模式:每個抽象產品派生多個具體產品類,每個抽象工廠類派生多個具體工廠類,每個具體工廠類負責一個具體產品的實例創建;
抽象工廠模式:每個抽象產品派生多個具體產品類,每個抽象工廠派生多個具體工廠類,每個具體工廠負責多個(一系列)具體產品的實例創建。
//在UIKit框架下,我們用工廠方法和抽象工廠兩種設計模式分別實現了兩份Demo, 不理解兩種設計模式該如何實現的朋友可以到這里下載:??刷不出來,以后補上!
參考文章:
簡單工廠:http://blog.csdn.net/z251257144/article/details/7476849
工廠方法:http://blog.csdn.net/z251257144/article/details/7479183
抽象工廠:http://blog.csdn.net/z251257144/article/details/7482810