設(shè)計模式反射之工廠模式

image

設(shè)計模式是一種非常有用的編程技巧旭从,它對于代碼的重構(gòu)有些非常重要的作用,對于軟件開發(fā)人員來說渔欢,需要理解并嘗試著使用這些設(shè)計的方法猛拴。
個人感覺《設(shè)計模式之禪》這本書中講解的非常具體,每個模式都配以適當?shù)睦酉技瘢浅_m合學(xué)習(xí)設(shè)計模式的初學(xué)者坐漏,當然,程杰的《大話設(shè)計模式》也是非常好的一本書碧信,都可以拿過來當做一本工具書隨時查看理解設(shè)計的奧妙赊琳。

  工廠模式
  這個模式的名字就已經(jīng)告訴了我們它想要做什么,就是讓我們構(gòu)造出一個工廠砰碴,然后生產(chǎn)我們需要的東西躏筏,即生成對象。那么呈枉,為什么要構(gòu)造一個工廠呢趁尼,為什么不直接在代碼中直接 new 一個出來呢?
  想象這樣一種情況:有時我們設(shè)計一類東西時猖辫,這一類又包含有許多的具體類酥泞,那么,當我們需要得到這些對象時啃憎,如果我們一個一個的 new 出來芝囤,就會顯得很粗糙,而且如果構(gòu)造這些對象時,需要進行一些必要的初始化悯姊,而這些初始化操作對于這一類對象都是相似的羡藐,那么,我們的代碼中就會顯得非常的冗余悯许,在 new 之后會出現(xiàn)很多相似的初始化對象代碼仆嗦。
  這時,你就會想岸晦,有這樣一個東西欧啤,我只需要告訴它,我需要那個對象启上,那么邢隧,它就會生成那個對象,而且我不需要考慮到它實際的實現(xiàn)細節(jié)冈在。那么這個東西就叫做工廠倒慧。
  工廠模式分為三類:
  簡單工廠模式,工廠模式包券,抽象工廠模式
  下面就分別對這三個模式進行介紹
  
  簡單工廠模式
  這是最簡單的工廠模式類型纫谅,一般的設(shè)計會出現(xiàn)三個類或接口:
  1> 抽象產(chǎn)品類或者產(chǎn)品接口
  2> 具體產(chǎn)品類
  3> 工廠類
  注:這里我想多說幾句關(guān)于抽象類和接口的區(qū)別,抽象類和接口是非常相似的東西溅固,大部分時候它是可以互相代替的付秕,那么它們之間存在什么不同呢?我們從名字中可以看出一個是對一類對象的抽象侍郭,一個是類的接口询吴。舉一個例子就好像這樣,人分為黃種人亮元,白種人猛计。。爆捞。奉瘤,那么,對于人煮甥,我們需要設(shè)計出一個抽象類還是接口呢盗温?應(yīng)該設(shè)計成為抽象類,因為成肘,它是對人類的抽象肌访,所有的人都應(yīng)該具有這個特征。接口呢艇劫,什么應(yīng)該設(shè)計成為接口呢?就好像人的愛好一樣,比如店煞,游泳蟹演,臺球,乒乓球(這些都是我的愛好顷蟀,哈哈)酒请,它是后天養(yǎng)成的東西,是需要具體的實現(xiàn)的鸣个,所以羞反,這些應(yīng)該是設(shè)計成為接口,所以囤萤,一個黃種人的類就好像下面這樣:
  public class YellowHuman extends Human implements Swimming, PingPang ...  { }
  好的昼窗,回到前面的簡單工廠里面,說它簡單涛舍,因為這個模式只需要實現(xiàn)一個工廠類就能生產(chǎn)出我們需要的產(chǎn)品澄惊,還是以人種的例子(“著名的”女媧造人)做出說明。
  女媧制造出各種人種富雅,黃種人掸驱,白種人,黑種人没佑,首先毕贼,人具有的共同特點構(gòu)造出一個抽象類:

1.接口定義一個人類的統(tǒng)稱

/**
 * Created by wanggs on 2017/7/14.
 */
public interface Human {
    public abstract void laugh();
    public abstract void cry();
    public abstract void talk();
}

2.然后定義具體的人種:

package com.wanggs.factory;

/**
 * Created by wanggs on 2017/7/14.
 */
public class WhiteHuman implements Human {
    @Override
    public void laugh() {
        System.out.println("WhiteHuman.laugh");
    }

    @Override
    public void cry() {
        System.out.println("WhiteHuman.cry");
    }

    @Override
    public void talk() {
        System.out.println("WhiteHuman.talk");
    }
}

package com.wanggs.factory;

/**
 * Created by wanggs on 2017/7/14.
 */
public class YellowHuman implements Human  {
    @Override
    public void laugh() {
        System.out.println("YellowHuman.laugh");
    }

    @Override
    public void cry() {
        System.out.println("YellowHuman.cry");
    }

    @Override
    public void talk() {
        System.out.println("YellowHuman.talk");
    }
}

3.人的工廠

package com.wanggs.factory;

/**
 * Created by wanggs on 2017/7/14.
 */
public class HumanFactory {

    // 第一版
   /* public static Human produceHuman(String type) {
        if ("yellow".equals(type)) {
            return new YellowHuman();

        } else if ("white".equals(type)) {
            return new WhiteHuman();

        } else if ("black".equals(type)) {
            return new BlackHuman();

        }
        System.out.println("有誤");
        return null;

    }*/
    //第二版
   /* public static Human produceYellow() {
        return new YellowHuman();
    }

    public static Human produceBlack() {
        return new BlackHuman();
    }*/
    //第三版 使用反射
    public static Human createHuman(Class c) {
        Human human = null;
        try {
            human = (Human) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            System.out.println("顏色");
        } catch (IllegalAccessException e) {
            System.out.println("人定義錯誤");
        } catch (ClassNotFoundException e) {
            System.out.println("null");
        }
        return human;
    }


}

4. 測試

package com.wanggs.factory;

/**
 * Created by wanggs on 2017/7/14.
 */
public class NvWa {
    public static void main(String[] args) {

    Human human = HumanFactory.createHuman(YellowHuman.class);
    human.laugh();
    }
}

工廠模式(簡單工廠模式,工廠模式蛤奢,抽象工廠模式)是實際運用中最多的設(shè)計模式鬼癣,所以,需要理解這種模式远剩,并在實際的軟件開發(fā)中嘗試用這種設(shè)計模式構(gòu)造容易理解的架構(gòu)扣溺。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓜晤,隨后出現(xiàn)的幾起案子锥余,更是在濱河造成了極大的恐慌,老刑警劉巖痢掠,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驱犹,死亡現(xiàn)場離奇詭異,居然都是意外死亡足画,警方通過查閱死者的電腦和手機雄驹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淹辞,“玉大人医舆,你說我怎么就攤上這事。” “怎么了蔬将?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵爷速,是天一觀的道長。 經(jīng)常有香客問我霞怀,道長惫东,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任毙石,我火速辦了婚禮廉沮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐矩。我一直安慰自己滞时,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布丧蘸。 她就那樣靜靜地躺著漂洋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪力喷。 梳的紋絲不亂的頭發(fā)上刽漂,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音弟孟,去河邊找鬼贝咙。 笑死,一個胖子當著我的面吹牛拂募,可吹牛的內(nèi)容都是我干的庭猩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陈症,長吁一口氣:“原來是場噩夢啊……” “哼蔼水!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起录肯,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤趴腋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后论咏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體优炬,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年厅贪,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢护。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡养涮,死狀恐怖葵硕,靈堂內(nèi)的尸體忽然破棺而出眉抬,到底是詐尸還是另有隱情,我是刑警寧澤贬芥,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布吐辙,位于F島的核電站,受9級特大地震影響蘸劈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尊沸,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一威沫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洼专,春花似錦棒掠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜡镶,卻和暖如春雾袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背官还。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工芹橡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人望伦。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓林说,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屯伞。 傳聞我的和親對象是個殘疾皇子腿箩,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評論 25 707
  • 工廠模式是最常用的一類創(chuàng)建型設(shè)計模式,之前一直以為工廠模式只是23中設(shè)計模式中的一種劣摇,重新了解才知道這個模式還要細...
    晨鳴code閱讀 1,275評論 0 6
  • 今天和兩個教練聊天饵撑,確實很有收獲的一個早晨剑梳。一個是要內(nèi)關(guān),識別內(nèi)心體內(nèi)這個名字叫驕傲的腫瘤滑潘,腫瘤不除垢乙,我很危險。最...
    兩個小人在打架閱讀 304評論 0 1
  • 昨晚聽了老師的課激情滿滿準備隔天好好練语卤。今天一早醒來追逮,練了一會兒基本功酪刀,發(fā)現(xiàn)咽喉還是很不給力。為了打卡钮孵,還是堅持...
    書眉_96e7閱讀 371評論 0 0
  • 心情低落: 1骂倘,吃中飯前沒有沉思30秒,所以吃了很多肉巴席,很咸历涝。 2,貼錯憑證漾唉,沒有詳細檢查荧库。 3,沒有用年度損益調(diào)...
    freshriver閱讀 104評論 0 0