創(chuàng)建型模式:抽象工廠

個人博客原文:
創(chuàng)建型模式:抽象工廠

五大創(chuàng)建型模式之三:抽象工廠。

簡介

姓名 :抽象工廠

英文名 :Abstract Factory Pattern

價值觀 :不管你有多少產(chǎn)品章咧,給我就是了

個人介紹

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
為創(chuàng)建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。
(來自《設計模式之禪》)

今天講的是抽象工廠模式恢暖,小伙伴可能有疑問,抽象工廠和工廠方法之間都有工廠,那肯定是有什么聯(lián)系的陡蝇,具體是什么關系呢?簡單的說:工廠方法是在解決一個產(chǎn)品多個層級方面的事情哮肚;而抽象工廠致力于解決多個產(chǎn)品多個層級方面的事情登夫。舉個例子:汽車是由很多零件組成的,比如引擎允趟、輪胎恼策、方向盤等等。現(xiàn)在如果我們是輪胎生產(chǎn)方潮剪,要生產(chǎn)寶馬輪胎和奔馳輪胎涣楷,要用工廠方法還是抽象工廠實現(xiàn)呢?答案是:工廠方法抗碰。輪胎是一個產(chǎn)品狮斗,寶馬輪胎和奔馳輪胎是 2 個不同層級的輪胎,所以用工廠方法解決就足夠改含。假如現(xiàn)在我們是汽車生產(chǎn)方情龄,要生產(chǎn)寶馬汽車和奔馳汽車,汽車又包含輪胎和方向盤等等捍壤,要用哪個來實現(xiàn)?既然是上面的是工廠方法鞍爱,那這個就用抽象工廠鹃觉,因為這涉及到多個產(chǎn)品(輪胎、方向盤等等)和 2 個層級(寶馬和奔馳)睹逃。這里還沒有講抽象工廠的概念就說了工廠方法和抽象方法的區(qū)別盗扇,是不是有點陌生祷肯?嗯,先記住這個概念疗隶,分清楚兩者的區(qū)別佑笋。在不同場景使用不同的設計模式。

上面定義中:為創(chuàng)建一組相關或相互依賴的對象提供一個接口斑鼻。這樣子理解這句話蒋纬,比如上面說的輪胎和方向盤,寶馬汽車用的輪胎和方向盤需要都是寶馬品牌的坚弱,也就是說在安裝寶馬汽車的輪胎和方向盤的時候蜀备,得用寶馬生產(chǎn)的輪胎和方向盤,重要的一點是:輪胎和方向盤是互相依賴的荒叶,不能在寶馬汽車上安裝奔馳輪胎和寶馬方向盤碾阁,因為有這個依賴關系,所以我們需要提供一個額外的接口些楣,來保證寶馬汽車使用的輪胎和方向盤都是寶馬生產(chǎn)的脂凶。這就是抽象工廠干的事情。

你要的故事

上面用汽車安裝輪胎和方向盤的例子愁茁,那這里為了讓大家能深入理解蚕钦,就不用其他例子了。在一個設計模式講解的過程中埋市,我覺得用一個案例來講解可以減少讀者的閱讀理解成本冠桃,為了寫設計模式這一系列文章,看了不少設計模式方面的書籍道宅,有些書籍在講解一個設計模式的時候食听,用了不止一個例子,讀完之后印象不是很深刻污茵。這個系列寫完之后樱报,想要的效果是:不需要記住設計模式的定義,把這些故事以及故事對應是講哪個設計模式都記住了泞当,就真正掌握了這些內(nèi)容了迹蛤。

public class AbstractFactoryTest {

    public static void main(String[] args) {
        // 寶馬員工安裝輪胎和方向盤
        AbstractCarFactory bmwCarFacatory = new BMWCarFactory();
        bmwCarFacatory.installWheel();
        bmwCarFacatory.installSteeringWheel();

        // 奔馳員工安裝輪胎和方向盤
        AbstractCarFactory mercedesCarFacatory = new MercedesCarFacatory();
        mercedesCarFacatory.installWheel();
        mercedesCarFacatory.installSteeringWheel();
    }

}

/**
 * 汽車抽象工廠
 */
interface AbstractCarFactory {

    void installWheel();

    void installSteeringWheel();

}

/**
 * 寶馬工廠
 */
class BMWCarFactory implements AbstractCarFactory {

    @Override
    public void installWheel() {
        WheelFacatory wheelFacatory = new BMWWheelFacatory();
        String wheel = wheelFacatory.createWheel();
        System.out.println("安裝輪胎:" + wheel);
    }

    @Override
    public void installSteeringWheel() {
        SteeringWheelFacatory steeringWheelFacatory = new BMWSteeringWheelFacatory();
        String steeringWheel = steeringWheelFacatory.createSteeringWheel();
        System.out.println("安裝方向盤:" + steeringWheel);
    }
}

/**
 * 奔馳工廠
 */
class MercedesCarFacatory implements AbstractCarFactory {

    @Override
    public void installWheel() {
        WheelFacatory wheelFacatory = new MercedesWheelFacatory();
        String wheel = wheelFacatory.createWheel();
        System.out.println("安裝輪胎:" + wheel);
    }

    @Override
    public void installSteeringWheel() {
        SteeringWheelFacatory steeringWheelFacatory = new MercedesSteeringWheelFacatory();
        String steeringWheel = steeringWheelFacatory.createSteeringWheel();
        System.out.println("安裝方向盤:" + steeringWheel);
    }
}

/**
 * 輪胎工廠
 */
interface WheelFacatory {

    String createWheel();

}

/**
 * 寶馬輪胎工廠
 */
class BMWWheelFacatory implements WheelFacatory {

    @Override
    public String createWheel() {
        System.out.println("寶馬輪胎工廠生產(chǎn)輪胎");
        return "寶馬輪胎";
    }
}

/**
 * 奔馳輪胎工廠
 */
class MercedesWheelFacatory implements WheelFacatory {

    @Override
    public String createWheel() {
        System.out.println("奔馳輪胎工廠生產(chǎn)輪胎");
        return "奔馳輪胎";
    }
}

/**
 * 方向盤工廠
 */
interface SteeringWheelFacatory {

    String createSteeringWheel();

}

/**
 * 寶馬方向盤工廠
 */
class BMWSteeringWheelFacatory implements SteeringWheelFacatory {

    @Override
    public String createSteeringWheel() {
        System.out.println("寶馬方向盤工廠生產(chǎn)方向盤");
        return "寶馬方向盤";
    }
}

/**
 * 奔馳方向盤工廠
 */
class MercedesSteeringWheelFacatory implements SteeringWheelFacatory {

    @Override
    public String createSteeringWheel() {
        System.out.println("奔馳方向盤工廠生產(chǎn)方向盤");
        return "奔馳方向盤";
    }
}

代碼:

AbstractFactoryTest.java

還是和以往一樣,思維開拓一下襟士,這里列舉的是給汽車安裝輪胎和方向盤盗飒,汽車不止這些,如果要加個安裝引擎呢陋桂?要怎么實現(xiàn)逆趣?這里我就不寫出來了,讓小伙伴嘗試一下嗜历,寫出來了就理解抽象模式這個設計模式啦宣渗。

總結

簡單工廠抖所、工廠方法、抽象工廠這幾個工廠相關的設計模式的基本內(nèi)容都講完了痕囱,這幾個模式都是為了解耦田轧,為了可擴展。這里要著重說一下鞍恢,三者之間沒有好壞之分傻粘,只有在具體的場景才能發(fā)揮它們各自的優(yōu)勢。在單產(chǎn)品多層級有序,層級數(shù)量不多的情況下抹腿,可以使用簡單工廠,層級多且需要支持擴展旭寿,可以使用工廠方法警绩;在多產(chǎn)品多層級,可以使用抽象工廠盅称。

參考資料:《大話設計模式》肩祥、《Java設計模式》、《設計模式之禪》缩膝、《研磨設計模式》混狠、《Head First 設計模式》

推薦閱讀:
創(chuàng)建型模式:單例模式
創(chuàng)建型模式:工廠方法

希望文章對您有所幫助,設計模式系列會持續(xù)更新疾层,感興趣的同學可以關注公眾號将饺,第一時間獲取文章推送閱讀,也可以一起交流痛黎,交個朋友予弧。

公眾號之設計模式系列文章

公眾號
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湖饱,隨后出現(xiàn)的幾起案子掖蛤,更是在濱河造成了極大的恐慌,老刑警劉巖井厌,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚓庭,死亡現(xiàn)場離奇詭異,居然都是意外死亡仅仆,警方通過查閱死者的電腦和手機器赞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓拜,“玉大人拳魁,你說我怎么就攤上這事〈榛。” “怎么了潘懊?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贿衍。 經(jīng)常有香客問我授舟,道長,這世上最難降的妖魔是什么贸辈? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任释树,我火速辦了婚禮,結果婚禮上擎淤,老公的妹妹穿的比我還像新娘奢啥。我一直安慰自己,他們只是感情好嘴拢,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布桩盲。 她就那樣靜靜地躺著,像睡著了一般席吴。 火紅的嫁衣襯著肌膚如雪赌结。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天孝冒,我揣著相機與錄音柬姚,去河邊找鬼。 笑死庄涡,一個胖子當著我的面吹牛量承,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穴店,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撕捍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迹鹅?” 一聲冷哼從身側(cè)響起卦洽,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斜棚,沒想到半個月后阀蒂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡弟蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蚤霞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义钉。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡昧绣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捶闸,到底是詐尸還是另有隱情夜畴,我是刑警寧澤拖刃,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贪绘,受9級特大地震影響兑牡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜税灌,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一均函、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菱涤,春花似錦苞也、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翻擒,卻和暖如春氓涣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陋气。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工劳吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巩趁。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓痒玩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親议慰。 傳聞我的和親對象是個殘疾皇子蠢古,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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