工廠方法一直不懂它的價值,雖然知道它的形式。今天《iOS設計模式解析》+這篇回答忽然茅塞頓開。基於個人理解從新解釋一下。編程
對於一個模塊而言,它提供服務,服務的具體內容外界是不知道的,如餐廳提供吃飯的服務,具體菜是怎麼作出來的外界是不知道的(由於分工須要,不可能每件事都知道)。這裏服務就是接口interface,具體服務內容就是實現implematation。segmentfault
而後一個接口可能對應多個服務,一樣是「點菜」,不一樣的菜區別很大、同一個菜不一樣的廚師、不一樣的餐廳區別也很大。因此這裏就存在一系列的區別因素,這些因素共同決定了這個接口到底會選擇什麼樣的實現。設計模式
因此你會發現從接口到實現之間的關聯是有一個邏輯判斷的,而工廠方法就是這個邏輯判斷,只是這是服務就是「建立一個對象」。設計
我如今要建立一個對象,可是我只有一些區別因素,好比造車,我只知道顏色、類別等,基於這些因素如何建立對象的邏輯,我把它寫到一個統一的方法裏,它就是工廠方法。code
這麼作的好處是:對象
想象一下不使用工廠方法會怎麼作:接口
if-else
,而後需求一變,每一個地方都要改而使用工廠方法,只要這個方法的聲明不變,那麼使用者就不要修改代碼,需求改變了也只是建立模塊這邊修改。get
就像造車(構建對象),我想要一個紅色的大空間的越野車(區別因素),我把需求提交給工廠,工廠給我車。至於工廠怎麼造車的,造了什麼車我是不知道的我也不關心,只要個人需求達到了就能夠了。io
最核心的問題,目光不要放到建立對象這個事情自己,而是從外界需求到對象選擇之間的這個邏輯身上,還有構建一個統一方法把邏輯流統一的這個出發點上。工廠方法只是「接口+N個實現」的這種模型在「構建對象」上的一個特例而已,它的核心意義並不在「構建對象」這個是事情自己上。class
從這個設計上看,我以爲它能夠理解爲是「面向接口編程」理念的一個子集。而更普遍的模型是:一個接口,有N個實現,外界提供一些區別因素,接口就像是大門,實現就像是大門裏的小門,區別因素從大門流入,走進不一樣的小門。除了工廠模式,還有不少的地方也會這麼作。