抽象工廠模式

抽象工廠模式相對于工廠方法模式來說,就是工廠方法模式是針對一個產(chǎn)品系列的啊胶,而抽象工廠模式是針對多個產(chǎn)品系列的甸各,即工廠方法模式是一個產(chǎn)品系列一個工廠類,而抽象工廠模式是多個產(chǎn)品系列一個工廠類焰坪。在抽象工廠模式中趣倾,客戶端不再負責對象的創(chuàng)建,而是把這個責任丟給了具體的工廠類某饰,客戶端只負責對對象的調(diào)用儒恋,從而明確了各個類的職責。并且當一系列相互關(guān)聯(lián)的產(chǎn)品被設(shè)計到一個工廠類里后黔漂,客戶端的調(diào)用將會變得非常簡單诫尽,而且,如果要更換這一系列的產(chǎn)品炬守,則只需要更換一個工廠類即可牧嫉。
如果客戶端需要創(chuàng)建一些產(chǎn)品結(jié)構(gòu),而這些產(chǎn)品結(jié)構(gòu)又分別屬于不同的產(chǎn)品類別,則可以使用抽象工廠模式酣藻,抽象工廠模式中抽象工廠類負責定義創(chuàng)建對象的接口曹洽,具體這一系列對象的創(chuàng)建工作由實現(xiàn)抽象工廠的具體工廠類來完成。

package com.strife.pattern.factory;

/**
 * 抽象工廠
 *
 * @author mengzhenghao
 * @date 2022/5/28
 */
public class AbstractFactory {

    public static void main(String[] args) throws Exception {
        CarProductFactory factory = new ChinaCarFactory();
        factory.getCar("hq");
        factory.getCar("df");
        factory = new GermanyCarFactory();
        factory.getCar("ad");
        factory.getCar("bm");
    }
}

/** 抽象工廠 */
interface CarProductFactory {
    /** 生產(chǎn)汽車 */
    AbstractCarProduct getCar(String type) throws Exception;
}

/** 中國汽車工廠 */
class ChinaCarFactory implements CarProductFactory {

    @Override
    public AbstractCarProduct getCar(String type) throws Exception {
        AbstractCarProduct product = null;
        for (ChinaCarEnumType carEnumType : ChinaCarEnumType.values()) {
            if (type.equals(carEnumType.getCarType())) {
                product = (AbstractCarProduct) Class.forName(carEnumType.getClazz()).newInstance();
                product.name = carEnumType.getCarName();
                product.material();
                product.origin();
                break;
            }
        }
        if (product == null) {
            throw new RuntimeException("暫時不能生產(chǎn)該汽車");
        }
        return product;
    }
}

/** 德國汽車工廠 */
class GermanyCarFactory implements CarProductFactory {

    @Override
    public AbstractCarProduct getCar(String type) throws Exception {
        AbstractCarProduct product = null;
        for (GermanyCarEnumType carEnumType : GermanyCarEnumType.values()) {
            if (type.equals(carEnumType.getCarType())) {
                product = (AbstractCarProduct) Class.forName(carEnumType.getClazz()).newInstance();
                product.name = carEnumType.getCarName();
                product.material();
                product.origin();
                break;
            }
        }
        if (product == null) {
            throw new RuntimeException("暫時不能生產(chǎn)該汽車");
        }
        return product;
    }
}

/** 汽車生產(chǎn)抽象類 */
abstract class AbstractCarProduct {
    /** 汽車名稱 */
    protected String name ;
    /** 材料 */
    abstract void material() ;
    /** 產(chǎn)地 */
    abstract void origin() ;
}

/** 紅旗車 */
class HQCar extends AbstractCarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.name+"在中國北京生產(chǎn)");
    }
}
/** 東風車 */
class DFCar extends AbstractCarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.name+"在中國南京生產(chǎn)");
    }
}
/** 奧迪車 */
class ADCar extends AbstractCarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.name+"在德國柏林生產(chǎn)");
    }
}
/** 寶馬車 */
class BMCar extends AbstractCarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.name+"在德國慕尼黑生產(chǎn)");
    }
}

enum ChinaCarEnumType {
    /** 紅旗車 */
    HQ("hq", "紅旗", "com.strife.pattern.factory.HQCar"),
    /** 東風車 */
    DF("df", "東風", "com.strife.pattern.factory.DFCar");

    private final String carType;
    private final String carName;
    private final String clazz;

    ChinaCarEnumType(String carType, String carName, String clazz) {
        this.carType = carType;
        this.carName = carName;
        this.clazz = clazz;
    }

    public String getCarType() {
        return carType;
    }

    public String getCarName() {
        return carName;
    }

    public String getClazz() {
        return clazz;
    }
}

enum GermanyCarEnumType {
    /** 奧迪車 */
    AD("ad", "奧迪", "com.strife.pattern.factory.ADCar"),
    /** 寶馬車 */
    BM("bm", "寶馬", "com.strife.pattern.factory.BMCar");

    private final String carType;
    private final String carName;
    private final String clazz;

    GermanyCarEnumType(String carType, String carName, String clazz) {
        this.carType = carType;
        this.carName = carName;
        this.clazz = clazz;
    }

    public String getCarType() {
        return carType;
    }

    public String getCarName() {
        return carName;
    }

    public String getClazz() {
        return clazz;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辽剧,一起剝皮案震驚了整個濱河市衣洁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖仅,老刑警劉巖坊夫,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撤卢,居然都是意外死亡环凿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門放吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來智听,“玉大人,你說我怎么就攤上這事渡紫〉酵疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵惕澎,是天一觀的道長莉测。 經(jīng)常有香客問我,道長唧喉,這世上最難降的妖魔是什么捣卤? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮八孝,結(jié)果婚禮上董朝,老公的妹妹穿的比我還像新娘。我一直安慰自己干跛,他們只是感情好子姜,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楼入,像睡著了一般哥捕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浅辙,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天扭弧,我揣著相機與錄音阎姥,去河邊找鬼记舆。 笑死,一個胖子當著我的面吹牛呼巴,可吹牛的內(nèi)容都是我干的泽腮。 我是一名探鬼主播御蒲,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诊赊!你這毒婦竟也來了厚满?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤碧磅,失蹤者是張志新(化名)和其女友劉穎碘箍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲸郊,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡丰榴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秆撮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片四濒。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖职辨,靈堂內(nèi)的尸體忽然破棺而出盗蟆,到底是詐尸還是另有隱情,我是刑警寧澤舒裤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布喳资,位于F島的核電站,受9級特大地震影響腾供,放射性物質(zhì)發(fā)生泄漏骨饿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一台腥、第九天 我趴在偏房一處隱蔽的房頂上張望宏赘。 院中可真熱鬧,春花似錦黎侈、人聲如沸察署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴汪。三九已至,卻和暖如春休吠,著一層夾襖步出監(jiān)牢的瞬間扳埂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工瘤礁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阳懂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像岩调,于是被迫代替她去往敵國和親巷燥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容