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

定義

抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類

角色
  • 抽象產(chǎn)品類A
  • 抽象產(chǎn)品類B
  • 抽象工廠類
  • 具體工廠類C(生成A)
  • 具體工廠類D(生產(chǎn)B)
UML類圖
抽象工廠模式UML類圖
代碼
  • IBenz.java
public interface IBenz {
    void run();
}
  • IBWM.java
public interface IBWM {
    void run();
}
  • HomeUseBenz.java
public class HomeUseBenz implements IBenz {
    @Override
    public void run() {
        System.out.println("first.HomeUseBenz run");
    }
}
  • HomeUseBWM.java
public class HomeUseBWM implements IBWM {
    @Override
    public void run() {
        System.out.println("first.HomeUseBWM run");
    }
}
  • BusinessUseBenz.java
public class BusinessUseBenz implements IBenz {
    @Override
    public void run() {
        System.out.println("first.BusinessUseBenz run");
    }
}
  • BusinessUseBWM.java
public class BusinessUseBWM implements IBWM {
    @Override
    public void run() {
        System.out.println("first.BusinessUseBWM run");
    }
}
  • AbstarctFactory.java
public abstract class AbstarctFactory {
    public abstract IBWM createBWM();
    public abstract IBenz createBenz();
}
  • HomeUseFactory.java
public class HomeUseFactory extends AbstarctFactory {
    @Override
    public IBWM createBWM() {
        return new HomeUseBWM();
    }
    @Override
    public IBenz createBenz() {
        return new HomeUseBenz();
    }
}
  • BusinessFactory.java
public class BusinessFactory extends AbstarctFactory {
    @Override
    public IBWM createBWM() {
        return new BusinessUseBWM();
    }              
    @Override
    public IBenz createBenz() {
        return new BusinessUseBenz();
    }
}
抽象工廠模式的優(yōu)點(diǎn)
  • 1 易于交換產(chǎn)品系列膘怕,由于具體工廠類却特,在一個(gè)應(yīng)用中只需要在初始化的時(shí)候出現(xiàn)一次口柳,這就使得改變一個(gè)應(yīng)用的具體工廠變得非常容易竹勉,它只需要改變具體工廠即可使用不同的產(chǎn)品配置
  • 2 它讓具體的創(chuàng)建實(shí)例的過程與客戶端分離剧包,客戶端是通過它們的抽象接口操作實(shí)例驳癌,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離滑燃,不會(huì)出現(xiàn)在客戶代碼中
抽象工廠模式的缺點(diǎn)

如果想要增加一個(gè)不同的車型,則需要增加三個(gè)類以及修改三個(gè)工廠颓鲜,比較繁瑣表窘!

使用簡(jiǎn)單工廠改進(jìn)抽象工廠

UML類圖
簡(jiǎn)單工廠改進(jìn)抽象工廠UML.png
代碼
  • AllFactory.java
public class AllFactory {
    private static final String type = "home";
    //private static final String type = "business";
    public static IBenz createBenz(){
        IBenz benz = null;
        switch (type){
            case "home":
                benz = new HomeUseBenz();
                break;
            case "business":
                benz = new BusinessUseBenz();
                break;
        }
        return benz;
    }
    public static IBWM createBWM(){
        IBWM bwm = null;
        switch (type){
            case "home":
                bwm = new HomeUseBWM();
                break;
            case "business":
                bwm = new BusinessUseBWM();
                break;
        }
        return bwm;
    }
}

使用反射改進(jìn)抽象工廠方法
public class AllFactory {
    private final static String type="homeUse";
    //private final static String type="businessUse";

    public static IBenz createBenz() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        String className = type.substring(0, 1).toUpperCase() + type.substring(1) + "Benz";
        //獲取包路徑
        String packageName = new Object() {
            public String getPackageName() {
                return this.getClass().getPackage().getName();
            }
        }.getPackageName();
        Class<? extends IBenz> clazz = (Class<? extends IBenz>) Class.forName(packageName+"."+className);
        return clazz.newInstance();
    }
    public static IBWM createBWM() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        String className = type.substring(0, 1).toUpperCase() + type.substring(1) + "BWM";
        //獲取包路徑
        String packageName = new Object() {
            public String getPackageName() {
                return this.getClass().getPackage().getName();
            }
        }.getPackageName();
        Class<? extends IBWM> clazz = (Class<? extends IBWM>) Class.forName(packageName +"."+className);
        return clazz.newInstance();
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末典予,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乐严,更是在濱河造成了極大的恐慌瘤袖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昂验,死亡現(xiàn)場(chǎng)離奇詭異捂敌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)既琴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門占婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甫恩,你說我怎么就攤上這事锐涯。” “怎么了填物?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵纹腌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我滞磺,道長(zhǎng)升薯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任击困,我火速辦了婚禮涎劈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阅茶。我一直安慰自己蛛枚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布脸哀。 她就那樣靜靜地躺著蹦浦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撞蜂。 梳的紋絲不亂的頭發(fā)上盲镶,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音蝌诡,去河邊找鬼溉贿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浦旱,可吹牛的內(nèi)容都是我干的宇色。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宣蠕!你這毒婦竟也來了例隆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤植影,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涎永,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思币,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年羡微,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谷饿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妈倔,死狀恐怖博投,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盯蝴,我是刑警寧澤毅哗,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捧挺,受9級(jí)特大地震影響虑绵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闽烙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一翅睛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黑竞,春花似錦捕发、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至遏匆,卻和暖如春霞玄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拉岁。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工坷剧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊暖。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓惫企,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狞尔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚丛版、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,752評(píng)論 0 14
  • 抽象工廠模式(Abstract factory pattern) 抽象工廠模式(Abstract factory ...
    Airing閱讀 1,127評(píng)論 0 9
  • 在苗青家的幾天中偏序,春生享受了最高級(jí)別的待遇页畦,活兒不讓干,拿起掃帚掃地的權(quán)利也被剝奪了:往往是掃帚剛拿起來研儒,就被阿姨...
    西嶺布衣閱讀 117評(píng)論 0 3
  • 2018-02-17 姓名:郭祥華 組別:315期六項(xiàng)精進(jìn)努力一組 【日精進(jìn)打卡第105天】 【知~學(xué)習(xí)】 背誦《...
    華英雄_712d閱讀 207評(píng)論 0 0
  • 安裝 yum -y install docker-iowget -qO- https://get.docker.c...
    Martin_阿錘閱讀 250評(píng)論 0 0