(5)工廠方法模式

定義

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類棚唆。工廠方法模式是創(chuàng)建型設(shè)計(jì)模式


一個(gè)普通的例子

  • 工廠和產(chǎn)品的關(guān)系

UML圖

工廠方法模式

源代碼

  • 普通模式
    1. 普通的類與抽象類調(diào)用
  • 常用模式
    范型和反射構(gòu)造的,類似這樣
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            //用反射構(gòu)造具體的AudiCar對(duì)象
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }

例子

一璃俗、普通模式

普通的抽象類和類調(diào)用的方式

  1. 抽象產(chǎn)品類
/** 抽象產(chǎn)品類
 * Created by Niwa on 2017/7/22.
 */
public abstract class Product {
    /**
     *  產(chǎn)品類的抽象方法
     *  由具體的產(chǎn)品類去實(shí)現(xiàn)
     *
     * */
    public abstract void method();
}
  1. 具體產(chǎn)品類A
/** 具體產(chǎn)品類A
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteProductA extends Product{
    public ConcreteProductA() {
    }

    @Override
    public void method() {
        System.out.println("我是具體的產(chǎn)品類A");
    }
}

  1. 具體產(chǎn)品類B
/** 具體產(chǎn)品類B
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteProductB extends Product{
    public ConcreteProductB() {
    }

    @Override
    public void method() {
        System.out.println("我是具體的產(chǎn)品類A");
    }
}
  1. 抽象工廠類
/**
 * 抽象工廠類
 * Created by Niwa on 2017/7/22.
 */
public abstract class Factory {
    /**
     * 抽象工廠方法
     * 具體生成什么由子類去實(shí)現(xiàn)
     *
     * @return 具體的產(chǎn)品類
     */
    public abstract Product createProduct();
}

  1. 具體的工廠類章蚣,關(guān)鍵在這里頭,生成什么產(chǎn)品的方法
/** 具體的工廠類
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteFactory extends Factory {

    @Override
    public Product createProduct() {
        return new ConcreteProductA();
//        return new ConcreteProductB();
    }
}
  1. 測(cè)試
 public static void main(String[] args){
        Factory factory = new ConcreteFactory();
        ConcreteProductA concreteProductA = (ConcreteProductA) factory.createProduct();
        concreteProductA.method();
    }


結(jié)果:

我是具體的產(chǎn)品類A

二迎瞧、反射構(gòu)造模式

奧迪Q5,Q7和工廠的故事

  1. 奧迪汽車抽象產(chǎn)品類
/** 奧迪汽車抽象產(chǎn)品類
 * Created by Niwa on 2017/7/25.
 */
public abstract class AudiCar {
    /**
     *  車開走方法
     *
     * */
    public abstract void drive();

    /**
     *  車自動(dòng)導(dǎo)航
     *
     * */
    public abstract void selfNavigation();

}

  1. Q5和Q7

/**
 * 奧迪汽車具體產(chǎn)品類Q5
 * Created by Niwa on 2017/7/25.
 */
public class AudiQ5 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q5啟動(dòng)");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5開始自動(dòng)導(dǎo)航");
    }
}
/**
 * 奧迪汽車具體產(chǎn)品類Q7
 * Created by Niwa on 2017/7/25.
 */
public class AudiQ7 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q7啟動(dòng)");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q7開始自動(dòng)導(dǎo)航");
    }
}

  1. 奧迪的抽象工廠類
/**
 * 奧迪的抽象工廠類
 * Created by Niwa on 2017/7/25.
 */
public abstract class AudiFactory {
    /**
     * 這里的范型<T>指定很關(guān)鍵
     * 某車型的工廠方法逸吵,創(chuàng)建某車型對(duì)象
     *
     * @param clz 具體的suv 型號(hào)類型
     * @return 具體型號(hào)的suv車對(duì)象
     */
    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}
  1. 具體的奧迪汽車工廠凶硅,關(guān)鍵在這里,反射構(gòu)造具體的AudiCar對(duì)象

/**
 * 具體的奧迪汽車工廠
 * Created by Niwa on 2017/7/25.
 */
public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            //用反射構(gòu)造具體的AudiCar對(duì)象
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}
  1. 測(cè)試扫皱,

public static void main(String[] a){
        //構(gòu)造一個(gè)制造汽車的工廠對(duì)象
        AudiCarFactory audiCarFactory = new AudiCarFactory();

        //生產(chǎn)Q5
        AudiQ5 audiQ5 = audiCarFactory.createAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();

        //生產(chǎn)Q7
        AudiQ7 audiQ7 = audiCarFactory.createAudiCar(AudiQ7.class);
        audiQ7.drive();
        audiQ7.selfNavigation();

    }


結(jié)果:

Q5啟動(dòng)
Q5開始自動(dòng)導(dǎo)航
Q7啟動(dòng)
Q7開始自動(dòng)導(dǎo)航

源代碼:DesignPattern



參考

《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)讀書》
各大佬博客


end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末足绅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子韩脑,更是在濱河造成了極大的恐慌氢妈,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段多,死亡現(xiàn)場(chǎng)離奇詭異首量,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)进苍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門加缘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觉啊,你說我怎么就攤上這事生百。” “怎么了柄延?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缀程。 經(jīng)常有香客問我搜吧,道長(zhǎng),這世上最難降的妖魔是什么杨凑? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任滤奈,我火速辦了婚禮,結(jié)果婚禮上撩满,老公的妹妹穿的比我還像新娘蜒程。我一直安慰自己绅你,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布昭躺。 她就那樣靜靜地躺著忌锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪领炫。 梳的紋絲不亂的頭發(fā)上偶垮,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音帝洪,去河邊找鬼似舵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葱峡,可吹牛的內(nèi)容都是我干的砚哗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼砰奕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛛芥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脆淹,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤常空,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盖溺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓糙,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年烘嘱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆禽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝇庭,死狀恐怖醉鳖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哮内,我是刑警寧澤盗棵,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站北发,受9級(jí)特大地震影響纹因,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琳拨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一瞭恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狱庇,春花似錦惊畏、人聲如沸恶耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偷俭。三九已至,卻和暖如春农曲,著一層夾襖步出監(jiān)牢的瞬間社搅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工乳规, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留形葬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓暮的,卻偏偏與公主長(zhǎng)得像笙以,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冻辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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