設(shè)計模式-工廠方法模式

1 工廠方法模式介紹

工廠方法模式(Factory Pattern)是創(chuàng)建型設(shè)計模式之一搂根。工廠方法模式是一種結(jié)構(gòu)簡單的模式泼掠,在我們平時的開發(fā)中應(yīng)用很廣發(fā)校镐。其中工廠模式仔細(xì)區(qū)分的話押搪,可以分為三種树酪,分別是簡單工廠模式浅碾、工廠方法模式以及抽象工廠模式。在這里我們學(xué)習(xí)工廠方法模式续语。

2 工廠方法模式定義

定義一個用于創(chuàng)建對象的接口垂谢,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類

工廠方法模式UML類圖:

工廠方法模式-UML類圖

在工廠方法模式中主要分為四大模塊:

  • Product:抽象產(chǎn)品類疮茄,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類;
  • ConcreteProduct:具體產(chǎn)品類滥朱,實為實現(xiàn)抽象產(chǎn)品的某個具體產(chǎn)品的對象,現(xiàn)Product接口;
  • Factory:抽象工廠類力试,為工廠方法模式的核心徙邻,該方法返回一個Product類型的對象;
  • ConcreteFactory:具體工廠類,其實現(xiàn)了具體的業(yè)務(wù)邏輯畸裳,返回ConcreteFactory實例鹃栽。

3 工廠方法模式的使用場景

在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式躯畴。復(fù)雜對象適合使用工廠模式民鼓,用new就可以完成創(chuàng)建的對象無需使用工廠模式。

4 工廠方法模式使用示例

具體的工廠模式我們?nèi)缦率纠?/p>

產(chǎn)品抽象類

public abstract class Product {
    /**
     * 產(chǎn)品類的抽象方法
     * 由具體的產(chǎn)品類去實現(xiàn)
     */
    public abstract void method();
}

具體的產(chǎn)品類

可以有多個產(chǎn)品類蓬抄,都繼承于抽象產(chǎn)品類丰嘉,實現(xiàn)其抽象方法

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

public class ConcreteProductB extends Product{
    @Override
    public void method() {
       System.out.println("我是具體的產(chǎn)品B");
    }
}

抽象工廠類

public abstract class Factory {
    /**
     * 抽象工廠方法
     * 具體生產(chǎn)什么由子類去實現(xiàn)
     *
     * @return 具體產(chǎn)生的對象
     */
    public abstract <T extends Product> T createProduct(Class<T> clz);
}

具體工廠類

具體如何生產(chǎn)一個產(chǎn)品的對象,是由具體的工廠類實現(xiàn)的嚷缭。

public class ConcreteFactory extends Factory{
    /**
     * 抽象工廠方法
     * 具體生產(chǎn)什么由子類去實現(xiàn)
     * @param clz  產(chǎn)品對象類的類型
     * @return 具體的產(chǎn)品對象
     */
    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product)Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}

客戶端類

public class Client {
    public static void main(String[] args){
        Factory factory = new ConcreteFactory();
        Product pA = factory.createProduct(ConcreteProductA.class);
        pA.method();
        Product pB = factory.createProduct(ConcreteProductB.class);
        pB.method();
    }
}

//打印的日志:
//我是具體的產(chǎn)品A
//我是具體的產(chǎn)品B

從客戶端類中可以看出饮亏,需要哪一個類的對象就傳入哪一個類的類型即可,這種方法比較簡單阅爽,動態(tài)實現(xiàn)路幸。當(dāng)然也可以為每一個產(chǎn)品都定義一個具體的工廠來實現(xiàn)。具體實現(xiàn)如下:

public class ConcreteFactoryA extends Factory{
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

public class Client {
    public static void main(String[] args){
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.method();
    }
}

5 總結(jié)

我們可以看到工廠方法模式是完全符合設(shè)計原則的付翁,其降低了對象之間的耦合度简肴,而且工廠方法模式依賴于抽象的架構(gòu),將實例化的任務(wù)交由子類去完場百侧,有非常好的擴(kuò)展性砰识。

優(yōu)點

  • 客戶端想要創(chuàng)建一個對象,只要知道其名稱就看了佣渴;
  • 擴(kuò)展性高辫狼,在增加產(chǎn)品類的情況下,只要適當(dāng)?shù)匦薷木唧w的工廠類或擴(kuò)展一個工廠類辛润;
  • 屏蔽產(chǎn)品的具體實現(xiàn)膨处,客戶端只關(guān)心產(chǎn)品的接口。

缺點

每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠真椿,使得系統(tǒng)中類的個數(shù)成倍增加秦叛,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴瀑粥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挣跋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狞换,更是在濱河造成了極大的恐慌避咆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修噪,死亡現(xiàn)場離奇詭異查库,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)黄琼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門樊销,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脏款,你說我怎么就攤上這事围苫。” “怎么了撤师?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵剂府,是天一觀的道長。 經(jīng)常有香客問我剃盾,道長腺占,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任痒谴,我火速辦了婚禮衰伯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘积蔚。我一直安慰自己意鲸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布库倘。 她就那樣靜靜地躺著临扮,像睡著了一般论矾。 火紅的嫁衣襯著肌膚如雪教翩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天贪壳,我揣著相機(jī)與錄音饱亿,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛彪笼,可吹牛的內(nèi)容都是我干的钻注。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼配猫,長吁一口氣:“原來是場噩夢啊……” “哼幅恋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泵肄,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捆交,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腐巢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體品追,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年冯丙,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉瓦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡胃惜,死狀恐怖泞莉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情船殉,我是刑警寧澤戒财,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站捺弦,受9級特大地震影響饮寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜列吼,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一幽崩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寞钥,春花似錦慌申、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至您炉,卻和暖如春柒爵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赚爵。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工棉胀, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留法瑟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓唁奢,卻偏偏與公主長得像霎挟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麻掸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 設(shè)計原則: 要依賴抽象酥夭,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是工廠方法模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,338評論 0 6
  • 工廠方法模式 介紹 簡單工廠模式雖然簡單,并且實現(xiàn)了創(chuàng)建和使用分離的功能脊奋,但存在一個很嚴(yán)重的問題采郎。當(dāng)系統(tǒng)中需要引入...
    666真666閱讀 273評論 0 1
  • 定義 工廠方法模式是類的創(chuàng)建模式,又叫虛擬構(gòu)造器(Virtual Constructor)模式狂魔,或者多態(tài)性工廠模式...
    41uLove閱讀 239評論 0 2
  • 女媧造人的故事 女媧造人的故事大家都非常熟悉蒜埋,我們通過這一場景來學(xué)習(xí)工廠模式(例子很好,就是內(nèi)容有點胡扯)最楷。首先整份,...
    stayiwithime閱讀 1,341評論 0 0
  • 我們已經(jīng)上過了手工課,體育課籽孙,現(xiàn)在老師正教我畫畫呢烈评。
    王小唐閱讀 311評論 0 1