首頁 > 軟體

Java 超詳細講解設計模式之中的抽象工廠模式

2022-03-25 19:00:15

抽象工廠模式

前面文章介紹的工廠方法模式中考慮的是一類產品的生產,比如案例中的百事可樂工廠只能生產百事可樂,可口可樂工廠只能生產可口可樂,也就是說:工廠方法模式只考慮生產同等級的產品。

1、什麼是抽象工廠

在現實生活中許多工廠是綜合型的工廠,能生產多種類)的產品,就拿案例裡面的可樂來說,在節日的時候可能會有聖誕版的可樂,也可能有新年版的可樂(如果不存在就假設),這篇文章要介紹的抽象工廠模式將考慮多等級產品的生產,將同一個具體工廠所生產的位於不同等級的一組產品稱為一個產品族。

比如:

抽象工廠模式的定義:

是一種為存取類提供一個建立一組相關或相互依賴物件的介面,且存取類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。

抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品。

2、抽象工廠模式的優缺點

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

  • 系統中有多個產品族,每個具體工廠建立同一族但屬於不同等級結構的產品
  • 系統一次只可能消費其中某一族產品,即同族的產品一起使用

優點:

  • 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理
  • 當需要產品族時,抽象工廠可以保證使用者端始終只使用同一個產品的產品組
  • 抽象工廠增強了程式的可延伸性,當增加一個新的產品族時,不需要修改原始碼,滿足開閉原則

缺點:

當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度

3、抽象工廠模式的結構與實現

抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產品和具體產品等 4 個要素構成,但抽象工廠中方法個數不同,抽象產品的個數也不同。現在我們來分析其基本結構和實現方法

模式的結構:

  • 抽象工廠:提供了建立產品的介面,它包含多個建立產品的方法 newProduct(),可以建立多個不同等級的產品
  • 具體工廠:主要是實現抽象工廠中的多個抽象方法,完成具體產品的建立
  • 抽象產品:定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品
  • 具體產品:實現了抽象產品角色所定義的介面,由具體工廠來建立,它同具體工廠之間是多對一的關係

4、抽象工廠方法模式程式碼實現

這裡還是以上面兩篇文章的可樂工廠進行擴充套件,將按照以下的結構圖來設計和實現:

抽象可樂工廠結構圖(自繪):

可口可樂介面:

public interface CocaCola {
    public void CocaCola();
}

百事可樂介面:

public interface PepsiCola {
    public void PepsiCola();
}

聖誕版可口可樂:

/**
 * 生產聖誕版可口可樂的方法
 */
public class ChristmasCocaCola implements CocaCola{

    @Override
    public void CocaCola() {
        System.out.println("生產了聖誕版的可口可樂");
    }
}

新年版可口可樂:

/**
 * 生產新年版的可口可樂
 */
public class NewYearCocaCola implements CocaCola{
    @Override
    public void CocaCola() {
        System.out.println("生產了新年版的可口可樂");
    }
}

聖誕版百事可樂:

/**
 * 生產聖誕版百事可樂方法
 */
public class ChristmasPepsiCola implements PepsiCola{

    @Override
    public void PepsiCola() {
        System.out.println("生產了聖誕版的百事可樂");
    }
}

新年版百事可樂:

/**
 * 生產新年版百事可樂的方法
 */
public class NewYearPepsiCola implements PepsiCola{

    @Override
    public void PepsiCola() {
        System.out.println("生產了新年版的百事可樂");
    }
}

可樂工廠(抽象工廠):

/**
 * 可樂工廠(抽象工廠)
 * 可以生產兩種版本的可樂
 */

public interface ColaFactory {

    //生產可口可樂:兩個版本
    public CocaCola getCocaCola();

    //生產百事可樂:兩個版本
    public PepsiCola getPepsi();
}

聖誕版系列可樂工廠:

/**
 * 聖誕系列加工廠
 * 生產 聖誕的百事可樂和可口可樂
 */

public class ChristmasFactory implements ColaFactory{


    @Override
    public CocaCola getCocaCola() {
        return new ChristmasCocaCola();
    }

    @Override
    public PepsiCola getPepsi() {
        return new ChristmasPepsiCola();
    }
}

新年版系列可樂工廠:

/**
 * 新年版的加工廠
 * 可以生產新年版的可口可樂和百事可樂
 */
public class NewYearFactory implements ColaFactory{
    @Override
    public CocaCola getCocaCola() {
        return new NewYearCocaCola();
    }

    @Override
    public PepsiCola getPepsi() {
        return new NewYearPepsiCola();
    }
}

使用者端(測試類):

public class Test {
    public static void main(String[] args) {

        //生產聖誕版可口可樂:
        ColaFactory factory =  new ChristmasFactory();
        CocaCola cola = factory.getCocaCola();
        cola.CocaCola();

        //生產聖誕版百事可樂:
        ColaFactory factory1 = new ChristmasFactory();
        PepsiCola pepsiCola = factory1.getPepsi();
        pepsiCola.PepsiCola();


        //生產新年版的可口可樂:
        ColaFactory factory2 = new NewYearFactory();
        CocaCola cola1 = factory2.getCocaCola();
        cola1.CocaCola();

        //生產新年版的百事可樂:
        ColaFactory factory3 = new NewYearFactory();
        PepsiCola pepsiCola1 = factory3.getPepsi();
        pepsiCola1.PepsiCola();
        
    }
}

輸出結果:

生產了聖誕版的可口可樂
生產了聖誕版的百事可樂
生產了新年版的可口可樂
生產了新年版的百事可樂

這就是抽象工廠方法模式的可樂工廠,並且同一個具體工廠所生產的位於不同等級的一組產品稱為一個產品族。

5、抽象工廠模式的應用場景

  • 當需要建立的物件是一系列相互關聯或相互依賴的產品族時,比如飲料工廠內的多款飲料
  • 系統中有多個產品族,但每次只使用其中的某一族產品。比如一個只喝聖誕版的可口可樂和新年版的百事可樂
  • 系統中提供了產品的類庫,且所有產品的介面相同,使用者端不依賴產品範例的建立細節和內部結構。

6、抽象工廠模式的擴充套件

  • 當增加一個新的產品族時只需增加一個新的具體工廠,不需要修改原始碼,滿足開閉原則
  • 當產品族中需要增加一個新種類的產品時,則所有的工廠類都需要進行修改,不滿足開閉原則

注意: 當系統中只存在一個等級結構的產品時,抽象工廠模式將退化到工廠方法模式

最後:一張圖看懂簡單工廠模式、工廠方法模式、抽象工廠模式:

到此這篇關於Java 超詳細講解設計模式之中的抽象工廠模式的文章就介紹到這了,更多相關Java 抽象工廠模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com