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

上一篇的工廠模式中中茉贡,工廠生產(chǎn)出來的產(chǎn)品都是實(shí)現(xiàn)同一個(gè)接口或繼承同一個(gè)抽象類的嗽仪。而有時(shí)候工廠可以生產(chǎn)出不是同一個(gè)接口或抽象類的產(chǎn)品锡垄,也就是說生產(chǎn)出來的產(chǎn)品是不確定的破镰,就是抽象工廠了。

博客地址

定義

為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口默辨,而無需指定他們的具體類德频。

使用場景

適用于當(dāng)一組產(chǎn)品族之間有互相約束的時(shí)候。它的起源就來與這種模式缩幸,期初是解決不同操作系統(tǒng)的圖形化解決方案壹置。Windows和Linux是兩個(gè)系統(tǒng)竞思,可以看出兩個(gè)產(chǎn)品族,但里面的按鈕和文本要統(tǒng)一風(fēng)格钞护,他們有個(gè)字的產(chǎn)品等級(jí)盖喷。這就有了約束。


由上面可以看出UML圖了


AbstractFactory:抽象工廠角色难咕,聲明了一組用于創(chuàng)建一種產(chǎn)品的方法课梳,每個(gè)方法對(duì)應(yīng)生產(chǎn)一種產(chǎn)品,上面生成產(chǎn)品A和B余佃。
ConcreteFactory:具體工廠角色暮刃,實(shí)現(xiàn)了抽象工廠中定義的創(chuàng)建產(chǎn)品的方法,生成一組具體的產(chǎn)品爆土,每一個(gè)產(chǎn)品又位于某個(gè)產(chǎn)品等級(jí)中椭懊。
AbstractProduct:抽象產(chǎn)品角色,定義了每種產(chǎn)品應(yīng)有的方法
ConcreteProduct:具體的產(chǎn)品角色雾消,具體了工廠生產(chǎn)的具體獨(dú)享灾搏,實(shí)現(xiàn)抽象產(chǎn)品中聲明的方法挫望。
模板
抽象工廠:

public abstract class AbstractFactory {
    public abstract AbstractProductA createProductA();
    public abstract AbstractProductB createProductB();
}

具體的工廠1和2

public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

抽象的產(chǎn)品A和B

public abstract class AbstractProductA {
   public abstract void method();
}
public abstract class AbstractProductB {
   public abstract void method();
}

具體的產(chǎn)品A1立润,A2,B1媳板,B2

public class ConcreteProductA1 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("產(chǎn)品A1的方法");
    }
}
public class ConcreteProductA2 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("產(chǎn)品A2的方法");
    }
}
public class ConcreteProductB1 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("產(chǎn)品B1的方法");
    }
}
public class ConcreteProductB2 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("產(chǎn)品B2的方法");
    }
}

簡單實(shí)現(xiàn)

還是以車為例桑腮,上一次的奧迪用工廠模式生產(chǎn)了Q3,Q7蛉幸,但是他們的零件又有差別破讨,Q3的發(fā)動(dòng)機(jī)是國產(chǎn)的,輪胎是鐵的奕纫。Q7的發(fā)動(dòng)機(jī)是外國的提陶,輪胎是塑料的。不同的輪胎匹层,不同的發(fā)動(dòng)機(jī)隙笆,都也是一種產(chǎn)品類型,這時(shí)候就能用抽象產(chǎn)品模式:
汽車首先由生產(chǎn)輪胎升筏,發(fā)動(dòng)機(jī)撑柔,然后組裝成汽車。
抽象的工廠類聲明要生產(chǎn)兩種產(chǎn)品:

public abstract class CarFactory {
    public abstract ITire createTire();
    public abstract IEngine createEngine();
}

輪胎類:

interface ITire {
    void tire();
}
public class FerricFTire implements ITire {
    @Override
    public void tire() {
        System.out.println("鐵輪胎");
    }
}
public class PlasticTire implements ITire {
    @Override
    public void tire() {
        System.out.println("塑料輪胎");
    }
}

引擎類:

interface IEngine {
    void engine();
}
public class DomesticEngine implements IEngine {
    @Override
    public void engine() {
        System.out.println("國產(chǎn)引擎");
    }
}
public class ImportIEngine implements IEngine {
    @Override
    public void engine() {
        System.out.println("進(jìn)口引擎");
    }
}

具體工廠類

public class Q3Factory extends CarFactory {
    @Override
    public ITire createTire() {
        return new FerricFTire();
    }

    @Override
    public IEngine createEngine() {
        return new DomesticEngine();
    }
}

public class Q7Factory extends CarFactory {
    @Override
    public ITire createTire() {
        return new PlasticTire();
    }

    @Override
    public IEngine createEngine() {
        return new ImportIEngine();
    }
}

客戶端調(diào)用:

public class Client {
    public static void main(String[] args) {
        CarFactory Q3 = new Q3Factory();
        Q3.createEngine().engine();
        Q3.createTire().tire();
        System.out.println("===");
        CarFactory Q7 = new Q7Factory();
        Q7.createEngine().engine();
        Q7.createTire().tire();
    }
}

輸出:

國產(chǎn)引擎
鐵輪胎
===
進(jìn)口引擎
塑料輪胎

總結(jié)

抽象工廠模式用的并不多您访,它和簡單工廠和工廠模式的行為很相近铅忿,一般在開發(fā)中用工廠模式就可以解決問題。而且這幾種模式之間可以很隱晦的轉(zhuǎn)換灵汪,所以在用的時(shí)候不用特別在意是哪一種工廠模式檀训,只要能達(dá)到解耦的目的就行

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

  • 也是實(shí)現(xiàn)了解耦柑潦,客戶按抽象工廠進(jìn)行生產(chǎn),不需要知道具體的實(shí)現(xiàn)是誰峻凫。
  • 但是在產(chǎn)品等級(jí)上加了一個(gè)約束妒茬,便于管理。

缺點(diǎn)

要新家一個(gè)產(chǎn)品的時(shí)候要改動(dòng)非常多的對(duì)象蔚晨,而且要新增一大堆的文件乍钻。因?yàn)槊吭黾右粋€(gè)產(chǎn)品都要修改抽象類,所以他的實(shí)現(xiàn)類也要進(jìn)行相應(yīng)的修改铭腕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末银择,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子累舷,更是在濱河造成了極大的恐慌浩考,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件被盈,死亡現(xiàn)場離奇詭異析孽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)只怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門袜瞬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人身堡,你說我怎么就攤上這事邓尤。” “怎么了贴谎?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵汞扎,是天一觀的道長。 經(jīng)常有香客問我擅这,道長澈魄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任仲翎,我火速辦了婚禮痹扇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谭确。我一直安慰自己帘营,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布逐哈。 她就那樣靜靜地躺著芬迄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昂秃。 梳的紋絲不亂的頭發(fā)上禀梳,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天杜窄,我揣著相機(jī)與錄音,去河邊找鬼算途。 笑死塞耕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘴瓤。 我是一名探鬼主播扫外,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廓脆!你這毒婦竟也來了筛谚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤停忿,失蹤者是張志新(化名)和其女友劉穎驾讲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席赂,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吮铭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颅停。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谓晌。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖便监,靈堂內(nèi)的尸體忽然破棺而出扎谎,到底是詐尸還是另有隱情,我是刑警寧澤烧董,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胧奔,受9級(jí)特大地震影響逊移,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龙填,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一胳泉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岩遗,春花似錦扇商、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梆靖,卻和暖如春控汉,著一層夾襖步出監(jiān)牢的瞬間笔诵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工姑子, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乎婿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓街佑,卻偏偏與公主長得像谢翎,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沐旨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 設(shè)計(jì)模式匯總 一岳服、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,947評(píng)論 1 15
  • 工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu)希俩,解決了簡單工廠模式中工廠類職責(zé)太重的問題吊宋,但由于工廠方法模式中的每個(gè)工廠只生產(chǎn)一...
    justCode_閱讀 1,198評(píng)論 1 6
  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,116評(píng)論 0 6
  • 文章同步發(fā)放到CSDN博客 工廠模式 工廠模式主要是為創(chuàng)建對(duì)象提供接口颜武,將創(chuàng)建對(duì)象的過程隔離起來璃搜,實(shí)現(xiàn)了創(chuàng)建者與調(diào)...
    AFinalStone閱讀 310評(píng)論 0 0
  • 一、工廠模式簡介 意圖定義一個(gè)創(chuàng)建對(duì)象的接口鳞上,讓其子類自己決定實(shí)例化哪一個(gè)工廠類这吻,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)...
    怡紅快綠閱讀 603評(píng)論 0 0