首頁(yè)技術(shù)文章正文

程序的設(shè)計(jì)模式:三種工廠方法模式的使用

更新時(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)單工廠模式

簡(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)品。

1684833884591_33.png
簡(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)。

1684834049613_34.png

工廠方法模式

工廠方法模式的主要角色:

抽象工廠(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)。

1684834288542_35.png
工廠方法模式的調(diào)用關(guān)系如下:
1684834428736_36.png

優(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í);
1684832930784_產(chǎn)品族和產(chǎn)品等級(jí).png

抽象工廠模式是工廠方法模式的升級(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)系如下:

1684834908427_37.png
如果在有多個(gè)緯度的產(chǎn)品需要配合生產(chǎn)時(shí),優(yōu)先建議采用抽象工廠(工廠的工廠),抽象工廠方法模式在一般的企業(yè)開(kāi)發(fā)中的較少。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!