AbstractFactoryPattern抽象工廠模式

抽象工廠模式

1.定義

為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口提鸟,而且無需指定它們的具體類。

以女媧造人為例仅淑,定義人種(Product產(chǎn)品類)及八卦爐(工廠類)称勋。為人類定義膚色及性別屬性,從設(shè)計角度看涯竟,一個具體的對象可以通過膚色及性別確定赡鲜。生產(chǎn)的工廠類如果只有一個,生產(chǎn)出來的全都是男性或者女性庐船,因此需要拆分為兩個工具類银酬。

人類接口

public interface Human {
    // 每個人都有膚色  
    void getColor();
    // 每個人都有性別
    void getSex();
}

抽象人種類(根據(jù)膚色劃分)

/*
 * 白色人種
 */
public abstract class AbstractWhiteHuman implements Human {
    public void getColor() {
        System.out.println("白色人種皮膚是白色的")
    }
}

/*
 * 黑色人種
 */
public abstract class AbstractBlackHuman implements Human {
    public void getColor() {
        System.out.println("黑色人種皮膚是黑色的")
    }
}

/*
 * 黃色人種
 */
public abstract class AbstractYellowHuman implements Human {
    public void getColor() {
        System.out.println("黃色人種皮膚是黃色的")
    }
}

具體人類(產(chǎn)品類實現(xiàn)類),每個抽象類都有兩個實現(xiàn)類(男人和女人)筐钟,實現(xiàn)性別的定義揩瞪,以黃色人種為例

public class FemaleYellowHuman extends AbstractYellowHuman {
    public void getSex() {
        System.out.println("女性黃種人")
    }
}

public class MaleYellowHuman extends AbstractYellowHuman {
    public void getSex() {
        System.out.println("男性黃種人")
    }
}

其它的黑色人種與白色人種的代碼與此類似,不再重復(fù)編寫篓冲。到此所有的人種(產(chǎn)品類)已定義完畢李破,接下來需要定義八卦爐(工廠類)生產(chǎn)人類。

八卦爐接口

public interface HumanFactory {
    Human createYelloHuman();
  
    Human createBlackHuman();
  
    Human createWhiteHuman();
}

具體八卦爐(工廠實現(xiàn)類)壹将,按性別分為男性八卦爐及女性八卦爐

public class FemaleFactory implements HumanFactory {
    public Human createYelloHuman() {
        return new FemaleYelloHuman();
    }
  
    public Human createBlackHuman() {
        return new FemaleBlackHuman();
    }
  
    public Human createWhiteHuman() {
        return new FemaleWhiteHuman();
    }
}

public class MaleFactory implements HumanFactory {
    public Human createYelloHuman() {
        return new MaleYelloHuman();
    }
  
    public Human createBlackHuman() {
        return new MaleBlackHuman();
    }
  
    public Human createWhiteHuman() {
        return new MaleWhiteHuman();
    }
}

造人(場景類)

public class Client {
    public static void main(String[] args) {
        HumanFactory maleHumanFactory = new MaleFactory();
        HumanFactory femaleHumanFactory = new FemaleFactory();
        
        Human maleYellowHuman = maleHumanFactory.createYelloHuman();
        Human maleBlackHuman = maleHumanFactory.createBlackHuman();
        Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();
      
        Human femaleYellowHuman = femaleHumanFactory.createYelloHuman();
        Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();
        Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();
    }
}

抽象工廠模式是工廠方法模式的升級嗤攻,在有多個業(yè)務(wù)品種,業(yè)務(wù)分類時诽俯,通過抽象工廠模式產(chǎn)生需要的對象妇菱。如果將八卦爐(工廠類)比喻為車間,那八卦爐的類型(人種性別)可以稱作產(chǎn)品等級暴区,八卦爐的生產(chǎn)工藝(人種膚色)可以稱作產(chǎn)品線或產(chǎn)品族闯团。抽象工廠類的職責(zé)是定義每個工廠要實現(xiàn)的功能即產(chǎn)品線,有M個產(chǎn)品等級就應(yīng)該有M個八卦爐(工廠實現(xiàn)類)颜启,有N個產(chǎn)品線偷俭,在八卦爐(抽象工廠類)中就應(yīng)該有N個生產(chǎn)線(創(chuàng)建方法)。在場景類中缰盏,沒有任何一個方法與產(chǎn)品實現(xiàn)類有關(guān)系涌萤,對于一個產(chǎn)品來說淹遵,只需要知道它的工廠方法就可以直接生產(chǎn)一個產(chǎn)品對象,無需關(guān)心它的實現(xiàn)類负溪。

2.應(yīng)用

2.1 優(yōu)點

  • 封裝性透揣。每個產(chǎn)品的實現(xiàn)類不是高層模塊關(guān)心的,它關(guān)心的是接口川抡,是抽象辐真。只要知道工廠類,就可以創(chuàng)造出一個需要的對象崖堤。

2.2 缺點

  • 產(chǎn)品族擴展困難侍咱。增加新的產(chǎn)品線,抽象工廠類需要增加新的抽象方法密幔,且所有的工廠實現(xiàn)類都要修改楔脯。

2.3 使用場景

一組沒有任何關(guān)系的對象具有相同的約束,則可以使用抽象工廠模式胯甩。一個視頻編輯器及音頻編輯器昧廷,在unix和windows操作系統(tǒng)中雖然功能和界面都相同,但代碼的實現(xiàn)不同偎箫。也就是所說的具有共同的約束條件(操作系統(tǒng))木柬。因此可使用抽象工廠模式,產(chǎn)生不同操作系統(tǒng)下的視頻及音頻處理器淹办。

2.4 注意事項

在抽象工廠模式的缺點中所說的是產(chǎn)品族擴展困難眉枕,而不是產(chǎn)品等級擴展困難。擴展產(chǎn)品等級只需要增加一個新的工廠實現(xiàn)類即可娇唯,也就是橫向擴展容易齐遵,縱向擴展困難。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塔插,一起剝皮案震驚了整個濱河市梗摇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌想许,老刑警劉巖伶授,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異流纹,居然都是意外死亡糜烹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門漱凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疮蹦,“玉大人,你說我怎么就攤上這事茸炒°岛酰” “怎么了阵苇?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長感论。 經(jīng)常有香客問我绅项,道長比肄,這世上最難降的妖魔是什么快耿? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮芳绩,結(jié)果婚禮上铺浇,老公的妹妹穿的比我還像新娘。我一直安慰自己线衫,他們只是感情好枯跑,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刨啸。 梳的紋絲不亂的頭發(fā)上灼捂,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天辑甜,我揣著相機與錄音猫牡,去河邊找鬼骇陈。 笑死器联,一個胖子當(dāng)著我的面吹牛幸海,可吹牛的內(nèi)容都是我干的奥务。 我是一名探鬼主播官研,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼浇垦,長吁一口氣:“原來是場噩夢啊……” “哼朴摊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起此虑,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤仍劈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寡壮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讹弯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年况既,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片组民。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡棒仍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臭胜,到底是詐尸還是另有隱情莫其,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布耸三,位于F島的核電站乱陡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仪壮。R本人自食惡果不足惜憨颠,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爽彤,春花似錦养盗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嚷节,卻和暖如春聂儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丹喻。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工薄货, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍论。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓谅猾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳍悠。 傳聞我的和親對象是個殘疾皇子税娜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349