日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式-工厂模式(3)抽象工厂模式

發(fā)布時間:2025/3/19 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式-工厂模式(3)抽象工厂模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Java設計模式-工廠模式(2)工廠方法模式 我們知道了工廠方法模式解決了簡單工廠模式中的缺陷,做到了滿足開閉原則,但是時代是進步的,進而又產(chǎn)生新的問題,工廠難道只能生產(chǎn)一種東西嗎。我們所見到的工廠大都都是綜合性的。所以就有了抽象工廠模式。


放張圖舒緩一下心情。

Java設計模式-工廠模式(3)抽象工廠模式

    • 一、前言
      • 1)概述:
      • 2)角色概述:
      • 3)前文
    • 二、代碼實現(xiàn)
      • 1)抽象產(chǎn)品及具體產(chǎn)品:
      • 2)抽象工廠 及具體工廠
      • 3)測試
      • 4)優(yōu)缺點:
      • 5)使用場景:
    • 三、自言自語

一、前言

1)概述:

  • 抽象工廠模式(Abstract Factory Pattern)隸屬于設計模式中的創(chuàng)建型模式,用于產(chǎn)品族的構建。抽象工廠是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。
  • 工廠模式中的每一個形態(tài)都是針對一定問題的解決方案,工廠方法針對的是多個產(chǎn)品系列結構;而抽象工廠模式針對的是多個產(chǎn)品族結構,一個產(chǎn)品族內(nèi)有多個產(chǎn)品系列。
  • 抽象工廠模式相對于工廠方法模式來說,就是工廠方法模式是針對一個產(chǎn)品系列的,而抽象工廠模式是針對多個產(chǎn)品系列的,即工廠方法模式是一個產(chǎn)品系列一個工廠類,而抽象工廠模式是多個產(chǎn)品系列一個工廠類。
  • 如果客戶端需要創(chuàng)建一些產(chǎn)品結構,而這些產(chǎn)品結構又分別屬于不同的產(chǎn)品類別,則可以使用抽象工廠模式,抽象工廠模式中抽象工廠類負責定義創(chuàng)建對象的接口,具體這一系列對象的創(chuàng)建工作由實現(xiàn)抽象工廠的具體工廠類來完成。
  • 2)角色概述:

    抽象工廠模式中存在四種角色,分別是抽象工廠角色,具體工廠角色,抽象產(chǎn)品角色,具體產(chǎn)品角色。

    • 抽象工廠:提供了創(chuàng)建產(chǎn)品的接口,它包含多個創(chuàng)建產(chǎn)品的方法,可以創(chuàng)建多個不同等級的產(chǎn)品。
    • 具體工廠:主要是實現(xiàn)抽象工廠中的多個抽象方法,完成具體產(chǎn)品的創(chuàng)建。
    • 抽象產(chǎn)品:定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個抽象產(chǎn)品。
    • 具體產(chǎn)品:實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它 同具體工廠之間是多對一的關系。

    3)前文

    在這里再次上一篇文章中👉Java設計模式-工廠模式(2)工廠方法模式 中出現(xiàn)的問題再做一次擴展。

    原問題是:

    需求:設計一個咖啡店點餐系統(tǒng)。

    設計一個咖啡類(Coffee),并定義其兩個子類(美式咖啡【AmericanCoffee】和拿鐵咖啡【LatteCoffee】);再設計一個咖啡店類(CoffeeStore),咖啡店具有點咖啡的功能。

    但是現(xiàn)在我們咖啡店進行擴張了。

    現(xiàn)咖啡店業(yè)務發(fā)生改變,不僅要生產(chǎn)咖啡還要生產(chǎn)甜點,如提拉米蘇、抹茶慕斯等,要是按照工廠方法模式,需要定義提拉米蘇類、抹茶慕斯類、提拉米蘇工廠、抹茶慕斯工廠、甜點工廠類,很容易發(fā)生類爆炸情況。其中拿鐵咖啡、美式咖啡是一個產(chǎn)品等級,都是咖啡;提拉米蘇、抹茶慕斯也是一個產(chǎn)品等級;拿鐵咖啡和提拉米蘇是同一產(chǎn)品族(也就是都屬于意大利風味),美式咖啡和抹茶慕斯是同一產(chǎn)品族(也就是都屬于美式風味)。

    所以這個案例可以使用抽象工廠模式實現(xiàn)。類圖如下:

    二、代碼實現(xiàn)

    1)抽象產(chǎn)品及具體產(chǎn)品:

    第一種產(chǎn)品:

    Coffee(第一種抽象產(chǎn)品類)、AmericanCoffee和LatteCoffee (具體產(chǎn)品類)

    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 "拿鐵咖啡"; } }

    第二種產(chǎn)品:

    Dessert (第二種抽象產(chǎn)品 甜點) MatchaMousse、Tiramisu(具體產(chǎn)品類)

    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();} }

    如果要加同一個產(chǎn)品族的話,只需要再加一個對應的工廠類即可,不需要修改其他的類。

    4)優(yōu)缺點:

    抽象工廠模式除了具有工廠方法模式的優(yōu)點外,其他主要優(yōu)點如下。

    • 可以在類的內(nèi)部對產(chǎn)品族中相關聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進行管理。
    • 當需要產(chǎn)品族時,抽象工廠可以保證客戶端始終只使用同一個產(chǎn)品的產(chǎn)品組。
    • 抽象工廠增強了程序的可擴展性,當增加一個新的產(chǎn)品族時,不需要修改原代碼,滿足開閉原則。

    其缺點是:當產(chǎn)品族中需要增加一個新的產(chǎn)品時,所有的工廠類都需要進行修改。增加了系統(tǒng)的抽象性和理解難度。

    使用抽象工廠模式一般要滿足以下條件。

    • 系統(tǒng)中有多個產(chǎn)品族,每個具體工廠創(chuàng)建同一族但屬于不同等級結構的產(chǎn)品。
    • 系統(tǒng)一次只可能消費其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用。

    5)使用場景:

    如:輸入法換皮膚,一整套一起換。生成不同操作系統(tǒng)的程序。

    三、自言自語

    我也不知道文章寫出來是有用還是無用,只是想做一個分享。希望大家能夠喜歡并且在這里能有收獲。

    你好啊,要天天開心哦。下篇文章再見。

    此系列還在持續(xù)更新中… 我一定還會回來的。😁

    總結

    以上是生活随笔為你收集整理的Java设计模式-工厂模式(3)抽象工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。