ONE、簡(jiǎn)單工廠模式(靜態(tài)工廠模式)
一、介紹
簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式尖啡,是工廠模式的一種。簡(jiǎn)單工廠模式是由一
個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例剩膘。簡(jiǎn)單工廠模式定義了一個(gè)創(chuàng)建對(duì)象的類衅斩,由這個(gè)類來封裝實(shí)例化對(duì)象的行為(代碼)。在軟件開發(fā)中怠褐,當(dāng)我們會(huì)用到大量的創(chuàng)建某種畏梆、某類或者某批對(duì)象時(shí),就會(huì)使用到工廠模式.
- 將“類實(shí)例化的操作”與“使用對(duì)象的操作”分開惫搏,讓使用者不用知道具體參數(shù)就可以實(shí)例化出所需要的“產(chǎn)品”類具温,從而避免了在客戶端代碼中顯式指定,實(shí)現(xiàn)了解耦筐赔。
二铣猩、實(shí)現(xiàn)方法
直接貼幾篇講的比較清楚的文章吧
public class VendorFactory {
// 這里提供了一個(gè)靜態(tài)方法供外部調(diào)用,所以叫靜態(tài)工廠模式
public static IVender createVendor(String type) {
switch (type) {
case "A":
return new VendorA();
case "B":
return new VendorB();
default:
throw new RuntimeException("供應(yīng)商不存在");
}
}
}
public class Client {
public static void main(String[] args) {
String type = "A";
IVender iVender = VendorFactory.createVendor(type);
iVender.order();
}
}
三茴丰、總結(jié)
- 使用簡(jiǎn)單工廠模式可以將產(chǎn)品的“消費(fèi)”和生產(chǎn)完全分開达皿,客戶端只需要知道自己需要什么產(chǎn)品,如何來使用產(chǎn)品就可以了贿肩,具體的產(chǎn)品生產(chǎn)任務(wù)由具體的工廠類來實(shí)現(xiàn)峦椰。工廠類根據(jù)傳進(jìn)來的參數(shù)生產(chǎn)具體的產(chǎn)品供消費(fèi)者使用。這種模式使得更加利于擴(kuò)展汰规,當(dāng)有新的產(chǎn)品加入時(shí)僅僅需要在工廠中加入新產(chǎn)品的構(gòu)造就可以了汤功。
- 工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例溜哮,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任滔金,而僅僅“消費(fèi)”產(chǎn)品色解;簡(jiǎn)單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割,它提供了專門的工廠類用于創(chuàng)建對(duì)象
- 客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名餐茵,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可科阎,對(duì)于一些復(fù)雜的類名,通過簡(jiǎn)單工廠模式可以減少使用者的記憶量忿族。
-
系統(tǒng)擴(kuò)展困難锣笨,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí)道批,有可能造成工廠邏輯過于復(fù)雜错英,不利于系統(tǒng)的擴(kuò)展和維護(hù)。所以說從工廠的角度來說簡(jiǎn)單工廠模式是不符合“開-閉”原則的隆豹。
TWO走趋、工廠方法模式
一、介紹
現(xiàn)在對(duì)簡(jiǎn)單工廠模式進(jìn)行修改噪伊,不再設(shè)計(jì)一個(gè)工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體產(chǎn)品的創(chuàng)建過程交給專門的工廠子類去完成氮唯。
我們先定義一個(gè)抽象的工廠類鉴吹,再定義具體的工廠類來生產(chǎn)不同的子類產(chǎn)品,它們實(shí)現(xiàn)在抽象工廠類中定義的方法惩琉。
這種抽象化的結(jié)果使這種結(jié)構(gòu)可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品豆励,如果出現(xiàn)新的產(chǎn)品類型,只需要為這種新類型的產(chǎn)品創(chuàng)建一個(gè)具體的工廠類就可以獲得該實(shí)例瞒渠,這一特點(diǎn)無(wú)疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性良蒸,更加符合“開閉原則”。
二伍玖、實(shí)現(xiàn)方法
直接貼幾篇講的比較清楚的文章吧
使用步驟
步驟1: 創(chuàng)建抽象工廠類嫩痰,定義具體工廠的公共接口;
步驟2: 創(chuàng)建抽象產(chǎn)品類 窍箍,定義具體產(chǎn)品的公共接口串纺;
步驟3: 創(chuàng)建具體產(chǎn)品類(繼承抽象產(chǎn)品類) & 定義生產(chǎn)的具體產(chǎn)品;
步驟4:創(chuàng)建具體工廠類(繼承抽象工廠類)椰棘,定義創(chuàng)建對(duì)應(yīng)具體產(chǎn)品實(shí)例的方法纺棺;
步驟5:外界通過調(diào)用具體工廠類的方法,從而創(chuàng)建不同具體產(chǎn)品類的實(shí)例
三邪狞、總結(jié)
- 工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣祷蝌。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn)帆卓,而且克服了它的缺點(diǎn)巨朦。在工廠方法模式中米丘,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做罪郊。這個(gè)核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口蠕蚜,而不負(fù)責(zé)哪一個(gè)產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品悔橄。
- 在添加新產(chǎn)品時(shí)靶累,需要編寫新的具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類癣疟,系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加挣柬,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行睛挚,會(huì)給系統(tǒng)帶來一些額外的開銷邪蛔。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層扎狱,在客戶端代碼中均使用抽象層進(jìn)行定義侧到,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM淤击、反射等技術(shù)匠抗,增加了系統(tǒng)的實(shí)現(xiàn)難度。
- 雖然保證了工廠方法內(nèi)的對(duì)修改關(guān)閉污抬,但對(duì)于使用工廠方法的類汞贸,如果要更換另外一種產(chǎn)品,仍然需要修改實(shí)例化的具體工廠類印机;一個(gè)具體工廠只能創(chuàng)建一種具體產(chǎn)品
THREE矢腻、抽象工廠模式
一、介紹
工廠方法模式的工廠是創(chuàng)建出一種產(chǎn)品射赛,而抽象工廠是創(chuàng)建出一類產(chǎn)品
二多柑、實(shí)現(xiàn)方法
直接貼幾篇講的比較清楚的文章吧
三顷蟆、總結(jié)
- 設(shè)計(jì)模式 - 工廠三兄弟
- 創(chuàng)建對(duì)象實(shí)例時(shí),不要直接 new 類, 而是把這個(gè)new 類的動(dòng)作放在一個(gè)工廠的方法
中腐魂,并返回帐偎。變量不要直接持有具體類的引用。 - 不要讓類繼承具體類蛔屹,而是繼承抽象類或者是實(shí)現(xiàn)interface(接口)
- 不要覆蓋基類中已經(jīng)實(shí)現(xiàn)的方法削樊。