更新時(shí)間:2023-05-23 來(lái)源:黑馬程序員 瀏覽量:
工廠方法模式中包含簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式。下面我們以咖啡店的點(diǎn)單系統(tǒng)為例,演示工這三種工廠方法模式的使用,具體如下:
需求:設(shè)計(jì)一個(gè)咖啡店點(diǎn)餐系統(tǒng)。
設(shè)計(jì)一個(gè)咖啡類(Cofee),并定義其兩個(gè)子類(美式咖啡【AmericanCofee】和拿鐵咖啡【LatteCofee】);再設(shè)計(jì)一個(gè)咖啡店類(CofeeStore),咖啡店具有點(diǎn)咖啡的功能。
具體類的設(shè)計(jì)如下:
/** * 根據(jù)類型選擇不同的咖啡 * @param type * @return */ public static Coffee orderCoffee(String type){ Coffee coffee = null; if("american".equals(type)){ coffee = new AmericanCoffee(); }else if ("latte".equals(type)){ coffee = new LatteCoffee(); } //添加配料 coffee.addMilk(); coffee.addSuqar(); return coffee; }
簡(jiǎn)單工廠包含如下角色:
抽象產(chǎn)品 :定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
具體產(chǎn)品 :實(shí)現(xiàn)或者繼承抽象產(chǎn)品的子類。
具體工廠 :提供了創(chuàng)建產(chǎn)品的方法,調(diào)用者通過(guò)該方法來(lái)獲取產(chǎn)品。
簡(jiǎn)單工廠中所有的產(chǎn)品都共有一個(gè)工廠,如果新增產(chǎn)品,則需要修改代碼,違反開(kāi)閉原則。簡(jiǎn)單工廠是一種編程習(xí)慣,可以借鑒這種編程思路。
工廠方法模式的主要角色:
抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過(guò)它訪問(wèn)具體工廠的工廠方法來(lái)創(chuàng)建產(chǎn)品。
具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間一一對(duì)應(yīng)。
工廠方法模式
工廠方法模式的主要角色:
抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過(guò)它訪問(wèn)具體工廠的工廠方法來(lái)創(chuàng)建產(chǎn)品。
具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間一一對(duì)應(yīng)。
工廠方法模式的調(diào)用關(guān)系如下:
優(yōu)點(diǎn):
用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無(wú)須知道產(chǎn)品的具體創(chuàng)建過(guò)程。在系統(tǒng)增加新的產(chǎn)品時(shí)只需要添加具體產(chǎn)品類和對(duì)應(yīng)的具體工廠類,無(wú)須對(duì)原工廠進(jìn)行任何修改,滿足開(kāi)閉原則;
缺點(diǎn):
每增加一個(gè)產(chǎn)品就要增加一個(gè)具體產(chǎn)品類和一個(gè)對(duì)應(yīng)的具體工廠類,這增加了系統(tǒng)的復(fù)雜度。
工廠方法模式給每個(gè)產(chǎn)品都提供了一個(gè)工廠,讓工廠專門負(fù)責(zé)對(duì)應(yīng)的產(chǎn)品的生產(chǎn),遵循開(kāi)閉原則,工廠方法模式在項(xiàng)目中用的最多。
工廠方法模式只考慮生產(chǎn)同等級(jí)的產(chǎn)品,抽象工廠可以處理多等級(jí)產(chǎn)品的生產(chǎn),我們先來(lái)了解產(chǎn)品族和產(chǎn)品登記的概念。
產(chǎn)品族:一個(gè)品牌下面的所有產(chǎn)品;例如華為下面的電腦、手機(jī)稱為華為的產(chǎn)品族;
產(chǎn)品等級(jí):多個(gè)品牌下面的同種產(chǎn)品;例如華為和小米都有手機(jī)電腦為一個(gè)產(chǎn)品等級(jí);
抽象工廠模式是工廠方法模式的升級(jí)版本,工廠方法模式只生產(chǎn)一個(gè)等級(jí)的產(chǎn)品,而抽象工廠模式可生產(chǎn)多個(gè)等級(jí)的產(chǎn)品。一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。
如咖啡店業(yè)務(wù)發(fā)生改變,不僅要生產(chǎn)咖啡還要生產(chǎn)甜點(diǎn),用抽象工廠模式來(lái)表示的話,同一個(gè)產(chǎn)品等級(jí)(產(chǎn)品分類)同一個(gè)風(fēng)味,就是同一個(gè)產(chǎn)品族(相當(dāng)于同一個(gè)品牌)?咖啡:拿鐵咖啡、美式咖啡?甜點(diǎn):提拉米蘇、抹茶慕斯?美式風(fēng)味:美式咖啡、抹茶慕斯?意大利風(fēng)味:拿鐵咖啡、提拉米蘇。
抽象工廠模式的調(diào)用關(guān)系如下:
如果在有多個(gè)緯度的產(chǎn)品需要配合生產(chǎn)時(shí),優(yōu)先建議采用抽象工廠(工廠的工廠),抽象工廠方法模式在一般的企業(yè)開(kāi)發(fā)中的較少。