Java設(shè)計(jì)模式之工廠方法模式

定義

定義一個(gè)用于創(chuàng)建對(duì)象的接口七咧,讓子類決定實(shí)例化哪個(gè)類皱碘。工廠方法使一個(gè)類的實(shí)例化延遲到其子類压昼。

工廠方法與簡(jiǎn)單工廠

對(duì)于簡(jiǎn)單工廠模式送滞,我們知道其在工廠類中包含了必要的邏輯判斷,根據(jù)不同的條件來(lái)動(dòng)態(tài)實(shí)例化相關(guān)類朽褪。對(duì)于客戶端來(lái)說(shuō)置吓,這去除了與具體產(chǎn)品的依賴;但于此同時(shí)也帶來(lái)了一個(gè)問(wèn)題:如果我們要增加產(chǎn)品缔赠,比如我們要生產(chǎn)蘋果計(jì)算機(jī)衍锚,就需要在工廠類中添加一個(gè) Case 分支條件,這違背了開放封閉原則嗤堰,對(duì)修改也開放了戴质。而工廠方法模式就沒(méi)有違背這個(gè)開放封閉原則。如果我們需要生產(chǎn)蘋果電腦踢匣,則無(wú)需修改工廠類告匠,直接創(chuàng)建產(chǎn)品即可。

角色

  • Product:抽象產(chǎn)品類离唬。
  • ConcreteProduct:具體產(chǎn)品類后专,實(shí)現(xiàn) Product 接口。
  • Factory:抽象工廠類男娄,該方法返回一個(gè) Product 類型的對(duì)象行贪。
  • ConcreteFactory:具體工廠類,返回 ConcreteProduct 實(shí)例模闲。

工廠方法模式的簡(jiǎn)單實(shí)現(xiàn)

  1. 首先創(chuàng)建一個(gè)計(jì)算機(jī)的抽象產(chǎn)品類,其中有一個(gè)抽象方法用戶啟動(dòng)計(jì)算機(jī)生產(chǎn):
public abstract class Computer {
    /**
     * 產(chǎn)品的抽象方法崭捍,由具體的產(chǎn)品類實(shí)現(xiàn)
     */
    public abstract void start();
}
  1. 接著我們創(chuàng)建各個(gè)品牌的計(jì)算機(jī)尸折,其都繼承了自己的父類 Computer ,并實(shí)現(xiàn)了父類的 start 方法殷蛇。
public class LenovoComputer extends Computer {

    @Override
    public void start() {
        System.out.println("聯(lián)想計(jì)算機(jī)啟動(dòng)");
    }
}

public class HpComputer extends Computer {
    @Override
    public void start() {
        System.out.println("惠普計(jì)算機(jī)啟動(dòng)");
    }
}

public class AsusComputer extends Computer {
    @Override
    public void start() {
        System.out.println("華碩計(jì)算機(jī)啟動(dòng)");
    }
}
  1. 創(chuàng)建抽象工廠類实夹,里面有一個(gè) createComputer 方法,用于生產(chǎn)各種品牌的計(jì)算機(jī)粒梦。
public abstract class ComputerFactory {
    public abstract <T extends Computer> T createComputer(Class<T> clz);
}

  1. 創(chuàng)建具體工廠亮航,廣大代工廠是一個(gè)具體的工廠,其繼承抽象工廠匀们,通過(guò)反射來(lái)生產(chǎn)不同廠家的計(jì)算機(jī)缴淋。
public class GDComputerFactory extends ComputerFactory {
    @Override
    public <T extends Computer> T createComputer(Class<T> clz) {
            Computer computer = null;
            String className = clz.getName();
        try {
            //通過(guò)反射來(lái)生產(chǎn)不同廠家的計(jì)算機(jī)
            computer = (Computer)Class.forName(className).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) computer;
    }
}
  1. 客戶端調(diào)用,客戶端創(chuàng)建 GDComputerFactory 生產(chǎn)各種計(jì)算機(jī)。
public class Client {
    public static void main(String[] args) {
        ComputerFactory computerFactory = new GDComputerFactory();

        LenovoComputer mLenovoComputer = computerFactory.createComputer(LenovoComputer.class);
        mLenovoComputer.start();

        HpComputer mHpComputer = computerFactory.createComputer(HpComputer.class);
        mHpComputer.start();

        AsusComputer mAsusComputer = computerFactory.createComputer(AsusComputer.class);
        mAsusComputer.start();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末重抖,一起剝皮案震驚了整個(gè)濱河市露氮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钟沛,老刑警劉巖畔规,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恨统,居然都是意外死亡叁扫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門畜埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)莫绣,“玉大人,你說(shuō)我怎么就攤上這事由捎⊥米郏” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵狞玛,是天一觀的道長(zhǎng)软驰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)心肪,這世上最難降的妖魔是什么锭亏? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮硬鞍,結(jié)果婚禮上慧瘤,老公的妹妹穿的比我還像新娘。我一直安慰自己固该,他們只是感情好锅减,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伐坏,像睡著了一般怔匣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桦沉,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天每瞒,我揣著相機(jī)與錄音,去河邊找鬼纯露。 笑死剿骨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埠褪。 我是一名探鬼主播浓利,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挤庇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了荞膘?” 一聲冷哼從身側(cè)響起罚随,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羽资,沒(méi)想到半個(gè)月后淘菩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屠升,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年潮改,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腹暖。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汇在,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脏答,到底是詐尸還是另有隱情糕殉,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布殖告,位于F島的核電站阿蝶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏黄绩。R本人自食惡果不足惜羡洁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爽丹。 院中可真熱鬧筑煮,春花似錦、人聲如沸粤蝎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)初澎。三九已至袒餐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谤狡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工墓懂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捕仔。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像榜跌,于是被迫代替她去往敵國(guó)和親闪唆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(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
  • 上一篇介紹簡(jiǎn)單工廠模式 的時(shí)候提到它對(duì)開閉原則 支持的不夠础浮,因?yàn)槿绻行碌漠a(chǎn)品加入到系統(tǒng)中去帆调,就需要修改工廠類豆同,就...
    Michaelhbjian閱讀 476評(píng)論 0 0
  • 前言:本人最近由于項(xiàng)目任務(wù)提前完成番刊,以前對(duì)java的設(shè)計(jì)模式?jīng)]有太多的了解,在面試的時(shí)候影锈,也只能寥寥的舉出...
    Ray丶Cxy閱讀 268評(píng)論 0 1
  • 沉魚魚閱讀 117評(píng)論 0 0
  • 過(guò)了36歲生日芹务,清醒得看到對(duì)手:自己。 進(jìn)入自我成長(zhǎng)的第二階段鸭廷。 曾經(jīng)以為自己讀的書和自己工作的方式很高效,通過(guò)對(duì)...
    Crystal隨筆閱讀 450評(píng)論 1 1