溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中什么是抽象工廠

發(fā)布時(shí)間:2022-03-28 09:20:52 來(lái)源:億速云 閱讀:372 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java中什么是抽象工廠,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

抽象工廠模式

1、什么是抽象工廠

在現(xiàn)實(shí)生活中許多工廠是綜合型的工廠,能生產(chǎn)多種類)的產(chǎn)品,就拿案例里面的可樂(lè)來(lái)說(shuō),在節(jié)日的時(shí)候可能會(huì)有圣誕版的可樂(lè),也可能有新年版的可樂(lè)(如果不存在就假設(shè)),這篇文章要介紹的抽象工廠模式將考慮多等級(jí)產(chǎn)品的生產(chǎn),將同一個(gè)具體工廠所生產(chǎn)的位于不同等級(jí)的一組產(chǎn)品稱為一個(gè)產(chǎn)品族。

比如:

Java中什么是抽象工廠

抽象工廠模式的定義:

是一種為訪問(wèn)類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象的接口,且訪問(wèn)類無(wú)須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。

抽象工廠模式是工廠方法模式的升級(jí)版本,工廠方法模式只生產(chǎn)一個(gè)等級(jí)的產(chǎn)品,而抽象工廠模式可生產(chǎn)多個(gè)等級(jí)的產(chǎn)品。

2、抽象工廠模式的優(yōu)缺點(diǎn)

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

  • 系統(tǒng)中有多個(gè)產(chǎn)品族,每個(gè)具體工廠創(chuàng)建同一族但屬于不同等級(jí)結(jié)構(gòu)的產(chǎn)品

  • 系統(tǒng)一次只可能消費(fèi)其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用

優(yōu)點(diǎn):

  • 可以在類的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專門引入多個(gè)新的類來(lái)進(jìn)行管理

  • 當(dāng)需要產(chǎn)品族時(shí),抽象工廠可以保證客戶端始終只使用同一個(gè)產(chǎn)品的產(chǎn)品組

  • 抽象工廠增強(qiáng)了程序的可擴(kuò)展性,當(dāng)增加一個(gè)新的產(chǎn)品族時(shí),不需要修改原代碼,滿足開(kāi)閉原則

缺點(diǎn):

當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度

3、抽象工廠模式的結(jié)構(gòu)與實(shí)現(xiàn)

抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產(chǎn)品和具體產(chǎn)品等 4 個(gè)要素構(gòu)成,但抽象工廠中方法個(gè)數(shù)不同,抽象產(chǎn)品的個(gè)數(shù)也不同?,F(xiàn)在我們來(lái)分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法

模式的結(jié)構(gòu):

  • 抽象工廠:提供了創(chuàng)建產(chǎn)品的接口,它包含多個(gè)創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個(gè)不同等級(jí)的產(chǎn)品

  • 具體工廠:主要是實(shí)現(xiàn)抽象工廠中的多個(gè)抽象方法,完成具體產(chǎn)品的創(chuàng)建

  • 抽象產(chǎn)品:定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個(gè)抽象產(chǎn)品

  • 具體產(chǎn)品:實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間是多對(duì)一的關(guān)系

Java中什么是抽象工廠

4、抽象工廠方法模式代碼實(shí)現(xiàn)

這里還是以上面兩篇文章的可樂(lè)工廠進(jìn)行擴(kuò)展,將按照以下的結(jié)構(gòu)圖來(lái)設(shè)計(jì)和實(shí)現(xiàn):

抽象可樂(lè)工廠結(jié)構(gòu)圖(自繪):

Java中什么是抽象工廠

可口可樂(lè)接口:

public interface CocaCola {
    public void CocaCola();
}

百事可樂(lè)接口:

public interface PepsiCola {
    public void PepsiCola();
}

圣誕版可口可樂(lè):

/**
 * 生產(chǎn)圣誕版可口可樂(lè)的方法
 */
public class ChristmasCocaCola implements CocaCola{

    @Override
    public void CocaCola() {
        System.out.println("生產(chǎn)了圣誕版的可口可樂(lè)");
    }
}

新年版可口可樂(lè):

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

圣誕版百事可樂(lè):

/**
 * 生產(chǎn)圣誕版百事可樂(lè)方法
 */
public class ChristmasPepsiCola implements PepsiCola{

    @Override
    public void PepsiCola() {
        System.out.println("生產(chǎn)了圣誕版的百事可樂(lè)");
    }
}

新年版百事可樂(lè):

/**
 * 生產(chǎn)新年版百事可樂(lè)的方法
 */
public class NewYearPepsiCola implements PepsiCola{

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

可樂(lè)工廠(抽象工廠):

/**
 * 可樂(lè)工廠(抽象工廠)
 * 可以生產(chǎn)兩種版本的可樂(lè)
 */

public interface ColaFactory {

    //生產(chǎn)可口可樂(lè):兩個(gè)版本
    public CocaCola getCocaCola();

    //生產(chǎn)百事可樂(lè):兩個(gè)版本
    public PepsiCola getPepsi();
}

圣誕版系列可樂(lè)工廠:

/**
 * 圣誕系列加工廠
 * 生產(chǎn) 圣誕的百事可樂(lè)和可口可樂(lè)
 */

public class ChristmasFactory implements ColaFactory{


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

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

新年版系列可樂(lè)工廠:

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

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

客戶端(測(cè)試類):

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

        //生產(chǎn)圣誕版可口可樂(lè):
        ColaFactory factory =  new ChristmasFactory();
        CocaCola cola = factory.getCocaCola();
        cola.CocaCola();

        //生產(chǎn)圣誕版百事可樂(lè):
        ColaFactory factory1 = new ChristmasFactory();
        PepsiCola pepsiCola = factory1.getPepsi();
        pepsiCola.PepsiCola();


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

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

輸出結(jié)果:

生產(chǎn)了圣誕版的可口可樂(lè)
生產(chǎn)了圣誕版的百事可樂(lè)
生產(chǎn)了新年版的可口可樂(lè)
生產(chǎn)了新年版的百事可樂(lè)

這就是抽象工廠方法模式的可樂(lè)工廠,并且同一個(gè)具體工廠所生產(chǎn)的位于不同等級(jí)的一組產(chǎn)品稱為一個(gè)產(chǎn)品族。

5、抽象工廠模式的應(yīng)用場(chǎng)景

  • 當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時(shí),比如飲料工廠內(nèi)的多款飲料

  • 系統(tǒng)中有多個(gè)產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品。比如一個(gè)只喝圣誕版的可口可樂(lè)和新年版的百事可樂(lè)

  • 系統(tǒng)中提供了產(chǎn)品的類庫(kù),且所有產(chǎn)品的接口相同,客戶端不依賴產(chǎn)品實(shí)例的創(chuàng)建細(xì)節(jié)和內(nèi)部結(jié)構(gòu)。

6、抽象工廠模式的擴(kuò)展

  • 當(dāng)增加一個(gè)新的產(chǎn)品族時(shí)只需增加一個(gè)新的具體工廠,不需要修改原代碼,滿足開(kāi)閉原則

  • 當(dāng)產(chǎn)品族中需要增加一個(gè)新種類的產(chǎn)品時(shí),則所有的工廠類都需要進(jìn)行修改,不滿足開(kāi)閉原則

注意: 當(dāng)系統(tǒng)中只存在一個(gè)等級(jí)結(jié)構(gòu)的產(chǎn)品時(shí),抽象工廠模式將退化到工廠方法模式

最后:一張圖看懂簡(jiǎn)單工廠模式、工廠方法模式、抽象工廠模式:

Java中什么是抽象工廠

關(guān)于“Java中什么是抽象工廠”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI