Java设计模式-工厂模式(3)抽象工厂模式
在Java設計模式-工廠模式(2)工廠方法模式 我們知道了工廠方法模式解決了簡單工廠模式中的缺陷,做到了滿足開閉原則,但是時代是進步的,進而又產生新的問題,工廠難道只能生產一種東西嗎。我們所見到的工廠大都都是綜合性的。所以就有了抽象工廠模式。
放張圖舒緩一下心情。
Java設計模式-工廠模式(3)抽象工廠模式
- 一、前言
- 1)概述:
- 2)角色概述:
- 3)前文
- 二、代碼實現
- 1)抽象產品及具體產品:
- 2)抽象工廠 及具體工廠
- 3)測試
- 4)優缺點:
- 5)使用場景:
- 三、自言自語
一、前言
1)概述:
2)角色概述:
抽象工廠模式中存在四種角色,分別是抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色。
- 抽象工廠:提供了創建產品的接口,它包含多個創建產品的方法,可以創建多個不同等級的產品。
- 具體工廠:主要是實現抽象工廠中的多個抽象方法,完成具體產品的創建。
- 抽象產品:定義了產品的規范,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。
- 具體產品:實現了抽象產品角色所定義的接口,由具體工廠來創建,它 同具體工廠之間是多對一的關系。
3)前文
在這里再次上一篇文章中👉Java設計模式-工廠模式(2)工廠方法模式 中出現的問題再做一次擴展。
原問題是:
需求:設計一個咖啡店點餐系統。
設計一個咖啡類(Coffee),并定義其兩個子類(美式咖啡【AmericanCoffee】和拿鐵咖啡【LatteCoffee】);再設計一個咖啡店類(CoffeeStore),咖啡店具有點咖啡的功能。
但是現在我們咖啡店進行擴張了。
現咖啡店業務發生改變,不僅要生產咖啡還要生產甜點,如提拉米蘇、抹茶慕斯等,要是按照工廠方法模式,需要定義提拉米蘇類、抹茶慕斯類、提拉米蘇工廠、抹茶慕斯工廠、甜點工廠類,很容易發生類爆炸情況。其中拿鐵咖啡、美式咖啡是一個產品等級,都是咖啡;提拉米蘇、抹茶慕斯也是一個產品等級;拿鐵咖啡和提拉米蘇是同一產品族(也就是都屬于意大利風味),美式咖啡和抹茶慕斯是同一產品族(也就是都屬于美式風味)。
所以這個案例可以使用抽象工廠模式實現。類圖如下:
二、代碼實現
1)抽象產品及具體產品:
第一種產品:
Coffee(第一種抽象產品類)、AmericanCoffee和LatteCoffee (具體產品類)
public abstract class Coffee {public abstract void addMilk();public abstract void addSugar();public abstract String getName(); } public class AmericanCoffee extends Coffee {@Overridepublic void addMilk() { System.out.println("給咖啡加奶"); }@Overridepublic void addSugar() { System.out.println("給咖啡加糖"); }@Overridepublic String getName() { return "美式咖啡"; } } public class LatteCoffee extends Coffee {@Overridepublic void addMilk() { System.out.println("給咖啡加奶"); }@Overridepublic void addSugar() { System.out.println("給咖啡加糖"); }@Overridepublic String getName() { return "拿鐵咖啡"; } }第二種產品:
Dessert (第二種抽象產品 甜點) MatchaMousse、Tiramisu(具體產品類)
public abstract class Dessert {public abstract void show(); } public class MatchaMousse extends Dessert{@Overridepublic void show() { System.out.println("抹茶慕斯"); } } public class Tiramisu extends Dessert{@Overridepublic void show() { System.out.println("提拉米蘇"); } }2)抽象工廠 及具體工廠
DessertFactory (抽象工廠) AmericanDessertFactory 和(具體工廠)
public interface DessertFactory {Coffee createCoffee();Dessert createDessert(); } public class AmericanDessertFactory implements DessertFactory {@Overridepublic Coffee createCoffee() { return new AmericanCoffee(); }@Overridepublic Dessert createDessert() { return new MatchaMousse(); } } public class ItalyDessertFactory implements DessertFactory {@Overridepublic Coffee createCoffee() { return new LatteCoffee(); }@Overridepublic Dessert createDessert() { return new Tiramisu(); } }3)測試
public class Client {public static void main(String[] args) {// 想次美式東西// AmericanDessertFactory factory = new AmericanDessertFactory();// 想換成意大利風味,僅僅只需要換一個工廠類 其他的代碼無需改變ItalyDessertFactory factory= new ItalyDessertFactory();Coffee coffee = factory.createCoffee();Dessert dessert = factory.createDessert();System.out.println(coffee.getName());dessert.show();} }如果要加同一個產品族的話,只需要再加一個對應的工廠類即可,不需要修改其他的類。
4)優缺點:
抽象工廠模式除了具有工廠方法模式的優點外,其他主要優點如下。
- 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
- 當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。
- 抽象工廠增強了程序的可擴展性,當增加一個新的產品族時,不需要修改原代碼,滿足開閉原則。
其缺點是:當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。
使用抽象工廠模式一般要滿足以下條件。
- 系統中有多個產品族,每個具體工廠創建同一族但屬于不同等級結構的產品。
- 系統一次只可能消費其中某一族產品,即同族的產品一起使用。
5)使用場景:
如:輸入法換皮膚,一整套一起換。生成不同操作系統的程序。
三、自言自語
我也不知道文章寫出來是有用還是無用,只是想做一個分享。希望大家能夠喜歡并且在這里能有收獲。
你好啊,要天天開心哦。下篇文章再見。
此系列還在持續更新中… 我一定還會回來的。😁
總結
以上是生活随笔為你收集整理的Java设计模式-工厂模式(3)抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式-工厂模式(2)工厂方法
- 下一篇: JUC系列(八)| 读写锁-ReadWr