設(shè)計(jì)模式-抽象工廠模式

參考網(wǎng)站

http://www.runoob.com/design-pattern/abstract-factory-pattern.html

什么是抽象工廠模式?

抽象工廠模式是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠模式中,接口只負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類,每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
我對(duì)于抽象工廠的理解,就是將普通工廠在整合了一下。做一個(gè)創(chuàng)建普通工廠的工廠,這樣對(duì)于普通工廠的拓展就很好拓展。而且通過抽象工廠的創(chuàng)建類,返回的就是一個(gè)普通工廠,和開始的普通的工廠一樣。例如,我舉的例子就是說,因?yàn)橐路泻芏喾N類,所以衣服屬于一個(gè)衣服工廠。褲子呢?也一樣,當(dāng)然也應(yīng)該屬于一個(gè)褲子工廠。把衣服褲子整合一下,他們都屬于衣服,向上抽取。就抽出了一個(gè)服裝工廠。通過DressProducer.java這個(gè)類來得到一個(gè)指定的工廠。

使用方法

提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。什么時(shí)候使用呢?當(dāng)系統(tǒng)的產(chǎn)品有多個(gè)產(chǎn)品族,而系統(tǒng)只使用某一族的產(chǎn)品。

步驟

為衣服創(chuàng)建一個(gè)接口

Clother.java 衣服接口

public interface Clother {
    public void show();
}

創(chuàng)建不同類別的衣服

Jacket.java 夾克類

public class Jacket implements Clother {

    @Override
    public void show() {
        System.out.println("我穿的衣服是Jacket");
    }

}

Overcoat.java 大衣類

public class Overcoat implements Clother {

    @Override
    public void show() {
        System.out.println("我穿的衣服是大衣");
    }

}

為褲子創(chuàng)建一個(gè)接口

Trousers.java 褲子類

public interface Trousers {
    public void show();
}

創(chuàng)建不同類別的褲子

Shorts.java 短褲類

public class Shorts implements Trousers {

    @Override
    public void show() {
        System.out.println("我穿的褲子是短褲");
    }

}

Pants.java 長(zhǎng)褲類

public class Pants implements Trousers {

    @Override
    public void show() {
        System.out.println("我穿的褲子是皮褲");
    }

}

為服裝創(chuàng)建工廠類

DressFactory.java 服裝類

public abstract class DressFactory {
    abstract Clother getClother(String clotherName);
    abstract Trousers getTrousers(String trousersName);
}

為衣服和褲子創(chuàng)建不同的工廠類,并繼承服裝類

ClothesFactory.java 衣服工廠

public class ClothesFactory extends DressFactory {

    @Override
    Clother getClother(String clotherName) {
        if(clotherName == "jacket")
            return new Jacket();
        else if(clotherName == "overcoat")//隨便寫的兩種
            return new Overcoat();
        return null;
    }

    @Override
    Trousers getTrousers(String trousersName) {
        return null;
    }

}

TrousersFactory.java 褲子工廠

public class TrousersFactory extends DressFactory{

    @Override
    Clother getClother(String clotherName) {
        return null;
    }

    @Override
    Trousers getTrousers(String trousersName) {
        if(trousersName == "shorts")
            return new Shorts();
        else if(trousersName == "pants")//也只寫了兩種,差不多意思得了
            return new Pants();
        return null;
    }

}

為服裝類創(chuàng)建一個(gè)生成器類,通過傳入不同的字段,得到不同的工廠

DressProducer.java 生成器類

public class DressProducer {
    
    public DressFactory getDressFactory(String fatoryName){
        if(fatoryName == "clothes")
            return new ClothesFactory();
        else if(fatoryName == "trousers")
            return new TrousersFactory();
        return null;
    }
}

在客戶端使用DressProducer來獲取工廠,再通過工廠,獲取對(duì)應(yīng)的實(shí)例。

Client.java 客戶端類

public class Client {

    public static void main(String args[]){
        DressProducer dressProducer = new DressProducer();
        //得到工廠類
        DressFactory dressFactory = dressProducer.getDressFactory("clothes");
        Clother clother1 = dressFactory.getClother("jacket");
        Clother clother2 = dressFactory.getClother("overcoat");
        dressFactory = dressProducer.getDressFactory("trousers");
        Trousers trousers1 = dressFactory.getTrousers("shorts");
        Trousers trousers2 = dressFactory.getTrousers("pants");
        clother1.show();
        clother2.show();
        trousers1.show();
        trousers2.show();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,239評(píng)論 0 6
  • 抽象工廠模式 介紹 工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu),解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問題,但由于工廠方法模式...
    666真666閱讀 1,322評(píng)論 0 7
  • 這一篇博文來介紹工廠模式中的第三種抽象工廠模式。 介紹 抽象工廠模式(Abstract Factory Patte...
    東西的南北閱讀 483評(píng)論 0 1
  • 前言 Android的設(shè)計(jì)模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 9,451評(píng)論 1 14
  • 這是澄心365寫作計(jì)劃的第6日寫作內(nèi)容 不知道前方的路在哪里, 我抬起手搽搽朦朧的眼睛, 誰能告訴我 前方的路在哪...
    澄心2010閱讀 177評(píng)論 0 0

友情鏈接更多精彩內(nèi)容