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