設(shè)計(jì)模式(五)——簡(jiǎn)單工廠模式

前言

前面我們學(xué)習(xí)了相對(duì)簡(jiǎn)單的 原型模式 今天就讓我們一起來(lái)學(xué)習(xí)下另外一個(gè)很簡(jiǎn)單的模式:簡(jiǎn)單工廠模式

按照慣例我們先看下工廠的概念

工廠:又稱制造廠怠惶,是一所用以生產(chǎn)貨物的大型工業(yè)樓宇。大部分工廠皆設(shè)有以大型機(jī)器或設(shè)備構(gòu)成的生產(chǎn)線。

解決了什么問(wèn)題:

我們都知道计济,現(xiàn)實(shí)中的工廠解決的是生產(chǎn)力低下的問(wèn)題唐全。那軟件中的工廠呢安券?

軟件中的工廠其實(shí)跟現(xiàn)實(shí)中的工廠很像悉盆,都是為了解決創(chuàng)建產(chǎn)品的問(wèn)題。

現(xiàn)實(shí)中的工廠典唇,我們?nèi)舆M(jìn)去材料镊折,工廠生產(chǎn)成產(chǎn)品,我們不需要管他怎么生產(chǎn)的只要拿到最后的產(chǎn)品就行了介衔。

軟件里的工廠恨胚,我們?nèi)舆M(jìn)去參數(shù),工廠生產(chǎn)出來(lái)對(duì)象夜牡,我們也不需要中的他是怎么實(shí)例化的与纽,只要最后拿到相應(yīng)對(duì)象就行了侣签。

GOF在《設(shè)計(jì)模式》一書(shū)中將工廠模式分為兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。

將簡(jiǎn)單工廠模式(Simple Factory)看為工廠方法模式的一種特例急迂,兩者歸為一類影所。今天我們就先條軟柿子捏,從簡(jiǎn)單工廠模式入手僚碎。

按照慣例我們先擺出今天的內(nèi)容要點(diǎn):

通過(guò)這篇文章你能學(xué)到什么

(建議你可以帶著問(wèn)題去學(xué)習(xí))

1猴娩、簡(jiǎn)單工廠模式的定義;
2勺阐、簡(jiǎn)單工廠模式的寫(xiě)法卷中;
3、簡(jiǎn)單工廠模式的使用場(chǎng)景渊抽;
4蟆豫、簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn);

上面我們已經(jīng)了解了簡(jiǎn)單工廠的概念和工廠在日常生活中的解釋懒闷,我們?cè)賮?lái)看軟件工程中簡(jiǎn)單工廠模式的定義:

簡(jiǎn)單工廠模式(Simple Factory Pattern):定義一個(gè)工廠類十减,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類愤估。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法帮辟,因此簡(jiǎn)單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式玩焰。

我們一起來(lái)分析一下簡(jiǎn)單工廠模式的定義由驹,可以看到,簡(jiǎn)單工廠模式的要點(diǎn)在于:

當(dāng)你當(dāng)你需要什么昔园,只需要傳入一個(gè)正確的參數(shù)蔓榄,就可以獲取你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建細(xì)節(jié)默刚。簡(jiǎn)單工廠模式結(jié)構(gòu)比較簡(jiǎn)單润樱,其核心是工廠類的設(shè)計(jì)。

簡(jiǎn)單解釋就是:我給你傳參羡棵,你給我對(duì)象。我不需要管你是怎么創(chuàng)建的嗅钻。

簡(jiǎn)單工程模式的類圖

簡(jiǎn)單工廠模式的類圖如下:

簡(jiǎn)單工廠模式類圖.jpg

通過(guò)類圖我們可以看到皂冰,簡(jiǎn)單工廠模式主要是有三個(gè)角色:Factory(工廠角色)、Product(抽象產(chǎn)品角色)养篓、ConcreteProduct(具體產(chǎn)品角色)秃流,接下來(lái)我們先分別認(rèn)識(shí)一下這三個(gè)角色:

Factory(工廠角色):工廠角色即工廠類,它是簡(jiǎn)單工廠模式的核心柳弄,負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有產(chǎn)品實(shí)例的內(nèi)部邏輯舶胀;工廠類可以被外界直接調(diào)用概说,創(chuàng)建所需的產(chǎn)品對(duì)象;在工廠類中提供了靜態(tài)的工廠方法factoryMethod()嚣伐,它的返回類型為抽象產(chǎn)品類型Product糖赔。

Product(抽象產(chǎn)品角色):它是工廠類所創(chuàng)建的所有對(duì)象的父類,封裝了各種產(chǎn)品對(duì)象的公有方法轩端,它的引入將提高系統(tǒng)的靈活性放典,使得在工廠類中只需定義一個(gè)通用的工廠方法,因?yàn)樗袆?chuàng)建的具體產(chǎn)品對(duì)象都是其子類對(duì)象基茵。

ConcreteProduct(具體產(chǎn)品角色):它是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)奋构,所有被創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。每一個(gè)具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色拱层,需要實(shí)現(xiàn)在抽象產(chǎn)品中聲明的抽象方法弥臼。

看完類圖和成員介紹不知道大家有沒(méi)有對(duì)簡(jiǎn)單工廠模式有一個(gè)更深刻的認(rèn)識(shí)?

什么還沒(méi)有根灯,好吧径缅。那接下來(lái)我們通過(guò)一個(gè)具體的代碼例子來(lái)加深一下印象。

簡(jiǎn)單的例子

我們都知道可口可樂(lè)公司生產(chǎn)了很多飲料箱吕,雪碧芥驳、芬達(dá)、肥仔快樂(lè)水等茬高;那這些飲料肯定都是通過(guò)飲料工廠來(lái)生產(chǎn)的兆旬,那我們就用簡(jiǎn)單工廠模式來(lái)實(shí)現(xiàn)一下這個(gè)場(chǎng)景:

抽象產(chǎn)品:Produce —— 飲料
具體產(chǎn)品:ConcreteProduct —— 具體飲料
工廠:Factory —— 飲料工廠

/**
 * @description: 飲料——抽象產(chǎn)品
 */
interface BeveragesProduct {

    /**
     * @description: 獲取飲料名稱
     * @date:
     * @company:
     * @author: Meteor
     */
    fun getBeveragesName()

    /**
     * @description: 設(shè)置飲料配方
     * @date:
     * @company:
     * @author: Meteor
     */
    fun getBeveragesRecipe()
}


/**
 * @description: 可樂(lè) —— 具體產(chǎn)品
 */
class Coke : BeveragesProduct {

    override fun getBeveragesName() {
        println("我是可樂(lè):別名肥仔快樂(lè)水")
    }

    override fun getBeveragesRecipe() {
        println("配方:水,二氧化碳怎栽,可樂(lè)糖漿")
    }

}

/**
 * @description: 芬達(dá) —— 具體產(chǎn)品
 */
class Fanta :BeveragesProduct{
    override fun getBeveragesName() {
        println("我是芬達(dá)")
    }

    override fun getBeveragesRecipe() {
        println("配方:水丽猬,二氧化碳,芬達(dá)糖漿")
    }
}


/**
 * @description: 雪碧 —— 具體產(chǎn)品
 */
class Sprite : BeveragesProduct {
    override fun getBeveragesName() {
        println("我是雪碧")
    }

    override fun getBeveragesRecipe() {
        println("配方:水熏瞄,二氧化碳脚祟,雪碧糖漿")
    }
}
/**
 * @description: 飲料工廠 —— 工廠
 */
class BeveragesFactory {

    companion object {
        val TYPE_COKE = 1
        val TYPE_FANTA = 2
        val TYPE_SPRITE = 3

        fun getBeverages(type: Int): BeveragesProduct? {
            var beveragesProduct: BeveragesProduct? = null
            when (type) {
                TYPE_COKE -> {
                    beveragesProduct = Coke()
                }
                TYPE_FANTA -> {
                    beveragesProduct = Fanta()
                }
                TYPE_SPRITE -> {
                    beveragesProduct = Sprite()
                }
            }
            return beveragesProduct
        }
    }

}

/**
 * @description: 肥仔,老喝碳酸飲料
 */
class Fatty {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            //通過(guò)往工廠傳類型强饮,獲取具體對(duì)象
            val beveragesProduct: BeveragesProduct? = BeveragesFactory.getBeverages(BeveragesFactory.TYPE_COKE)
            beveragesProduct?.getBeveragesName()
            beveragesProduct?.getBeveragesRecipe()
        }
    }
}

工作中使用的場(chǎng)景

簡(jiǎn)單工廠模式在工作中有很多應(yīng)用的地方由桌,具體在哪里使用,參照下面兩個(gè)因素就可以了:

1邮丰、工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少行您,由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過(guò)復(fù)雜剪廉。
2娃循、客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象并不關(guān)心斗蒋。

優(yōu)點(diǎn)

簡(jiǎn)單工廠模式的優(yōu)點(diǎn)主要有以下幾點(diǎn):

1捌斧、 工廠類包含必要的判斷邏輯笛质,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的職責(zé)捞蚂,而僅僅“消費(fèi)”產(chǎn)品妇押,簡(jiǎn)單工廠模式實(shí)現(xiàn)了對(duì)象創(chuàng)建和使用的分離。

2洞难、 客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名舆吮,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可,對(duì)于一些復(fù)雜的類名队贱,通過(guò)簡(jiǎn)單工廠模式可以在一定程度減少使用者的記憶量色冀。

3、通過(guò)引入配置文件柱嫌,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類锋恬,在一定程度上提高了系統(tǒng)的靈活性。

缺點(diǎn)

當(dāng)然簡(jiǎn)單工廠模式也有它的缺點(diǎn):

1编丘、由于工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯与学,職責(zé)過(guò)重,一旦不能正常工作嘉抓,整個(gè)系統(tǒng)都要受到影響索守。

2、使用簡(jiǎn)單工廠模式勢(shì)必會(huì)增加系統(tǒng)中類的個(gè)數(shù)(引入了新的工廠類)抑片,增加了系統(tǒng)的復(fù)雜度和理解難度卵佛。

3、系統(tǒng)擴(kuò)展困難敞斋,一旦添加新產(chǎn)品就不得不修改工廠邏輯截汪,在產(chǎn)品類型較多時(shí),有可能造成工廠邏輯過(guò)于復(fù)雜植捎,不利于系統(tǒng)的擴(kuò)展和維護(hù)衙解。

4、簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法焰枢,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)蚓峦。

總結(jié)

其實(shí)簡(jiǎn)單工廠模式還是相對(duì)比較好理解的,通俗點(diǎn)說(shuō)就是把我們之前各種通過(guò) if 判斷后創(chuàng)建的對(duì)象济锄,封裝了起來(lái)(因?yàn)楣S里面也是通過(guò)if判斷的)枫匾,不過(guò)把這塊單獨(dú)抽離了出來(lái),做了解耦方便我們維護(hù)和管理拟淮。

簡(jiǎn)單工廠模式屬于工廠模式和抽象工廠模式的基礎(chǔ),先學(xué)好這個(gè)對(duì)學(xué)習(xí)后面兩個(gè)有幫助谴忧。

設(shè)計(jì)模式目錄

設(shè)計(jì)模式(一)—— 認(rèn)識(shí)設(shè)計(jì)模式
設(shè)計(jì)模式(二)—— 技術(shù)直男正確“面向?qū)ο蟆钡牧笤瓌t
設(shè)計(jì)模式(三)—— 單例模式
設(shè)計(jì)模式(四)—— 原型模式
設(shè)計(jì)模式(五)—— 簡(jiǎn)單工廠模式

參考資料

《設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
《Head First設(shè)計(jì)模式》
《大話設(shè)計(jì)模式》
《設(shè)計(jì)模式之禪》
《Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》

劉偉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末很泊,一起剝皮案震驚了整個(gè)濱河市角虫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌委造,老刑警劉巖戳鹅,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昏兆,居然都是意外死亡枫虏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)爬虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)隶债,“玉大人,你說(shuō)我怎么就攤上這事跑筝∷蓝铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵曲梗,是天一觀的道長(zhǎng)赞警。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虏两,這世上最難降的妖魔是什么愧旦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮定罢,結(jié)果婚禮上笤虫,老公的妹妹穿的比我還像新娘。我一直安慰自己引颈,他們只是感情好耕皮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蝙场,像睡著了一般凌停。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上售滤,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天罚拟,我揣著相機(jī)與錄音,去河邊找鬼完箩。 笑死赐俗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弊知。 我是一名探鬼主播阻逮,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秩彤!你這毒婦竟也來(lái)了叔扼?” 一聲冷哼從身側(cè)響起事哭,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓜富,沒(méi)想到半個(gè)月后鳍咱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡与柑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年谤辜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片价捧。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丑念,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出干旧,到底是詐尸還是另有隱情渠欺,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布椎眯,位于F島的核電站挠将,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏编整。R本人自食惡果不足惜舔稀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌测。 院中可真熱鬧内贮,春花似錦、人聲如沸汞斧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粘勒。三九已至竞端,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庙睡,已是汗流浹背事富。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乘陪,地道東北人统台。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像啡邑,于是被迫代替她去往敵國(guó)和親贱勃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349