工廠方法一直不懂它的價(jià)值负敏,雖然知道它的形式。今天《iOS設(shè)計(jì)模式解析》+這篇回答突然茅塞頓開秘蛇∑渥觯基于我的理解重新解釋一下顶考。
首先構(gòu)建一下背景
對于一個(gè)模塊而言,它提供服務(wù)妖泄,服務(wù)的具體內(nèi)容外界是不知道的村怪,如餐廳提供吃飯的服務(wù),具體菜是怎么做出來的外界是不知道的(因?yàn)榉止ば枰÷豢赡苊考露贾溃_@里服務(wù)就是接口interface柬焕,具體服務(wù)內(nèi)容就是實(shí)現(xiàn)implematation审残。
然后一個(gè)接口可能對應(yīng)多個(gè)服務(wù),同樣是“點(diǎn)菜”斑举,不同的菜區(qū)別很大搅轿、同一個(gè)菜不同的廚師、不同的餐廳區(qū)別也很大富玷。所以這里就存在一系列的區(qū)別因素璧坟,這些因素共同決定了這個(gè)接口到底會選擇什么樣的實(shí)現(xiàn)。
所以你會發(fā)現(xiàn)從接口到實(shí)現(xiàn)之間的關(guān)聯(lián)是有一個(gè)邏輯判斷的赎懦,而工廠方法就是這個(gè)邏輯判斷雀鹃,只是這是服務(wù)就是“創(chuàng)建一個(gè)對象”。
工廠方法只是特例應(yīng)用
我現(xiàn)在要?jiǎng)?chuàng)建一個(gè)對象励两,但是我只有一些區(qū)別因素黎茎,比如造車,我只知道顏色当悔、類別等傅瞻,基于這些因素如何創(chuàng)建對象的邏輯,我把它寫到一個(gè)統(tǒng)一的方法里盲憎,它就是工廠方法嗅骄。
這么做的好處是:
- 這個(gè)邏輯判斷誰更清楚?創(chuàng)建者還是調(diào)用者饼疙?肯定是創(chuàng)建者溺森,是它提供了創(chuàng)建對象的服務(wù)。
- 使用統(tǒng)一的方法窑眯,可以保證判斷邏輯的統(tǒng)一儿惫,如果以后要修改這個(gè)邏輯,只需要修改一處就可以了伸但。
想象一下不使用工廠方法會怎么做:
- 每個(gè)構(gòu)建的地方我都來一遍邏輯判斷肾请,寫上N個(gè)
if-else
,然后需求一變更胖,每個(gè)地方都要改 - 每個(gè)構(gòu)建的地方铛铁,我都知道具體要哪個(gè)對象隔显,我不需要做判斷,直接指定需要的對象構(gòu)建饵逐。如果這個(gè)對象是另一個(gè)模塊的括眠,這么做就相當(dāng)于把構(gòu)建選擇的邏輯摻雜到里當(dāng)前的模塊里,甚至更明顯的倍权,那個(gè)模塊是另一個(gè)部分做的掷豺,需求變了以后兩個(gè)部門都要改代碼,這就會比較亂了薄声。
而使用工廠方法当船,只要這個(gè)方法的聲明不變,那么使用者就不要修改代碼默辨,需求改變了也只是創(chuàng)建模塊這邊修改德频。
就像造車(構(gòu)建對象),我想要一個(gè)紅色的大空間的越野車(區(qū)別因素)缩幸,我把需求提交給工廠壹置,工廠給我車。至于工廠怎么造車的表谊,造了什么車我是不知道的我也不關(guān)心钞护,只要我的需求達(dá)到了就可以了。
最核心的問題爆办,目光不要放到創(chuàng)建對象這個(gè)事情本身患亿,而是從外界需求到對象選擇之間的這個(gè)邏輯身上,還有構(gòu)建一個(gè)統(tǒng)一方法把邏輯流統(tǒng)一的這個(gè)出發(fā)點(diǎn)上押逼。工廠方法只是“接口+N個(gè)實(shí)現(xiàn)”的這種模型在“構(gòu)建對象”上的一個(gè)特例而已步藕,它的核心意義并不在“構(gòu)建對象”這個(gè)是事情本身上。
發(fā)散
從這個(gè)設(shè)計(jì)上看挑格,我覺得它可以理解為是“面向接口編程”理念的一個(gè)子集咙冗。而更廣泛的模型是:一個(gè)接口,有N個(gè)實(shí)現(xiàn)漂彤,外界提供一些區(qū)別因素雾消,接口就像是大門,實(shí)現(xiàn)就像是大門里的小門挫望,區(qū)別因素從大門流入立润,走進(jìn)不同的小門。除了工廠模式媳板,還有很多的地方也會這么做桑腮。