模式(FactoryMethod)的定義:
? ? ? 定義一個創(chuàng)建產(chǎn)品對象的工廠接口蟀架,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當中罚攀。滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點庞溜。我們把被創(chuàng)建的對象稱為“產(chǎn)品”看杭,把創(chuàng)建產(chǎn)品的對象稱為“工廠”惭等。如果要創(chuàng)建的產(chǎn)品不多褒纲,只要一個工廠類就可以完成翁狐,這種模式叫“簡單工廠模式”类溢,它不屬于 GoF 的 23 種經(jīng)典設(shè)計模式,它的缺點是增加新產(chǎn)品時會違背“開閉原則”露懒。
模式的3種變體:
?? 簡單工廠模式: 允許接口創(chuàng)建對象闯冷,但不會暴露對象的創(chuàng)建邏輯。
?? 工廠方法模式:允許接口創(chuàng)建對象懈词,但使用哪個類來創(chuàng)建對象蛇耀,則是交由子類決定的。
?? 抽象工廠模式:抽象工廠是一個能夠創(chuàng)建一系列相關(guān)的對象而無需指定/公開其具體類的接口坎弯。該模式能夠提供其他工廠的對象蒂窒,在其內(nèi)部創(chuàng)建其他對象。
一荞怒、簡單工廠模式:
1.1定義
? ? ? 簡單工廠模式又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責(zé)創(chuàng)建其他類的實例洒琢,被創(chuàng)建的實例通常都具有共同的父類。該模式對對象創(chuàng)建管理方式最為簡單褐桌,因為其僅僅簡單的對不同類對象的創(chuàng)建進行了一層薄薄的封裝衰抑。 其UML類圖如下:
1.2類圖
1.3簡單工廠模式代碼
簡單工廠類:
客戶端代碼:
1.4簡單工廠模式的優(yōu)缺點
優(yōu)點:
??? 簡單工廠包含必要的判斷邏輯,簡單工廠實現(xiàn)了對象的創(chuàng)建和使用的分離荧嵌。
??? 客戶端無需知道所創(chuàng)建的具體產(chǎn)品類的類名呛踊,只需要具體產(chǎn)品類對應(yīng)的參數(shù)即可。
??? 在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類一定程度上提高了系統(tǒng)的靈活性啦撮。
缺點:
??? 工廠類的職責(zé)過重谭网,例如算術(shù)運算中簡單工廠中包含加減乘除的邏輯判斷語句,一旦它出現(xiàn)有問題赃春,整個系統(tǒng)都會出問題愉择。
??? 在添加新的類的時候,例如添加開根號運算那么簡單工廠類就要修改,違反了開放—封閉原則不利于系統(tǒng)的擴展和維護锥涕。
??? 簡單工廠的靜態(tài)方法衷戈,使得工廠角色無法形成基于繼承的等級結(jié)構(gòu)。
二层坠、工廠方法模式:?
2.1定義
工廠方法模式是對簡單工廠模式進一步的解耦殖妇,因為在工廠方法模式中是一個子類對應(yīng)一個工廠類,而這些工廠類都實現(xiàn)于一個抽象接口破花。工廠方法模式是一個用于創(chuàng)建對象的接口谦趣,讓子類決定實例化哪一個類。
? ? ? 注意事項:作為一種創(chuàng)建類模式座每,在任何需要生成復(fù)雜對象的地方蔚润,都可以使用工廠方法模式。有一點需要注意的地方就是復(fù)雜對象適合使用工廠模式尺栖,而簡單對象嫡纠,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式延赌。如果使用工廠模式除盏,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度挫以。
2.2類圖
2.3工廠模式代碼
定義一個工廠接口:
定義具體工廠類:
客戶端代碼:
? ?? 工廠方法克服了簡單工廠的缺點者蠕,增加新的產(chǎn)品時,不必修改現(xiàn)存的代碼只需要增加新代碼即可掐松,滿足開放封閉原則踱侣。
2.3工廠方法的優(yōu)缺點
優(yōu)點:
?? 原來是自己創(chuàng)建對象(new),而現(xiàn)在可以直接通過工廠傳遞所需要的對象大磺。
?? 使用工廠模式易于功能擴展抡句,只需返回共有的父類對象(此對象是多態(tài)對象),而不對其他造成影響杠愧。
?? 遵循代碼開閉原則待榔。
?? 封裝性:對外只保留基類(所有產(chǎn)線共有特征類),具體實現(xiàn)交由工廠選擇流济。
缺點:
? ? 假如某個具體產(chǎn)品類 需要進行一定的修改锐锣,很可能需要修改對應(yīng)的工廠類。當同時需要修改多個產(chǎn)品類的時候绳瘟,對工廠類的修改會變得特別麻煩雕憔。例如:每增加一個產(chǎn)品,相應(yīng)的也要增加一個子工廠糖声,會加大了額外的開發(fā)量斤彼。? ? ? ? ? ? ? ? ??
三分瘦、抽象工廠模式(Abstract Factory Pattern) :?
3.1定義
抽象工廠模式是一種為訪問類提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的不同等級的產(chǎn)品的模式結(jié)構(gòu)畅卓。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產(chǎn)一個等級的產(chǎn)品蟋恬,而抽象工廠模式可生產(chǎn)多個等級的產(chǎn)品翁潘。
3.2類圖
抽象工廠模式包含如下角色:
??? 抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心。
??? 具體工廠(Concrete Factory)角色:這個角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實例歼争。
??? 抽象產(chǎn)品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所創(chuàng)建的對象的父類拜马,或它們共同擁有的接口。
??? 具體產(chǎn)品(Concrete Product)角色:抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個具體產(chǎn)品類的實例沐绒。這是客戶端最終需要的東西俩莽。
3.3抽象工廠模式代碼
示例:
?? 例如:Q3和Q7有不同的輪胎、發(fā)動機乔遮、制動系統(tǒng)扮超。雖然生產(chǎn)的零件不同,型號不同蹋肮。但是根本上都有共同的約束出刷,就是輪胎、發(fā)動機坯辩、制動系統(tǒng)馁龟。設(shè)計如下:
1.需要一個抽象工廠,里面有三個接口分別為生產(chǎn)輪胎漆魔、發(fā)動機坷檩、制動系統(tǒng),抽象類
2.需要三個抽象產(chǎn)品分別為輪胎改抡、發(fā)動機矢炼、制動系統(tǒng)
3.需要實現(xiàn)上面的三個抽象類,定義出每個類不同的對象阿纤,比如:普通輪胎和越野輪胎
4.需要兩個具體類繼承自上面的抽象類裸删,實現(xiàn)具體的工廠,比如:生產(chǎn)Q3的工廠A和生產(chǎn)Q7的工廠B
5.在客戶端new出對應(yīng)的具體工廠并調(diào)用對應(yīng)的生產(chǎn)方法
1.抽象工廠:
2.根據(jù)抽象接口定義不同的對象:
3.實現(xiàn)具體的工廠類:
4.客戶端使用:
5.結(jié)果輸出:
3.4抽象工廠模式的優(yōu)缺點
抽象工廠模式的優(yōu)點:
? ? ?? 抽象工廠模式除了具有工廠方法模式的優(yōu)點外阵赠,最主要的優(yōu)點就是可以在類的內(nèi)部對產(chǎn)品族進行約束涯塔。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián)清蚀,抽象工廠模式就可以在類內(nèi)部對產(chǎn)品族的關(guān)聯(lián)關(guān)系進行定義和描述匕荸,而不必專門引入一個新的類來進行管理。
抽象工廠模式的缺點: ? ??
? ? ?? 產(chǎn)品族的擴展費力枷邪,假如產(chǎn)品族中需要增加一個新的產(chǎn)品榛搔,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產(chǎn)品等級結(jié)構(gòu)的劃分是非常重要的践惑。
3.5抽象工廠模式與工廠方法模式的區(qū)別
??? 抽象工廠模式是工廠方法模式的升級版本腹泌,他用來創(chuàng)建一組相關(guān)或者相互依賴的對象。他與工廠方法模式的區(qū)別就在于:工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu)尔觉;而抽象工廠模式則是針對的多個產(chǎn)品等級結(jié)構(gòu)凉袱。在編程中,通常一個產(chǎn)品結(jié)構(gòu)侦铜,表現(xiàn)為一個接口或者抽象類专甩,也就是說,工廠方法模式提供的所有產(chǎn)品都是衍生自同一個接口或抽象類钉稍,而抽象工廠模式所提供的產(chǎn)品則是衍生自不同的接口或抽象類涤躲。
??? 在抽象工廠模式中,有一個產(chǎn)品族的概念:所謂的產(chǎn)品族贡未,是指位于不同產(chǎn)品等級結(jié)構(gòu)中功能相關(guān)聯(lián)的產(chǎn)品組成的家族种樱。抽象工廠模式所提供的一系列產(chǎn)品就組成一個產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個等級結(jié)構(gòu)俊卤。我們依然拿生產(chǎn)汽車的例子來說明他們之間的區(qū)別缸托。