工廠方法模式是我們前面提到的簡單工廠模式的延伸,他是gof23中的建立型模式,解決的仍然是產品物件建立相關問題,也是我們比較常用的一種設計模式。
工廠方式法模式(factory method),定義了乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到子類。型別是建立型模式。
我們仍然以車輛生產作為背景介紹工廠方法模式,虛擬的情況不用對號入座。**商有若干個工廠,可以生產各種汽車,比如賓士、別克、法拉利等等。根據訂單情況,選擇生產。**如下:
建立產品類(介面或者抽象類)
package com.xxfamly.creational.factorymethod;
/** * 產品:汽車
*/public inte***ce car
建立工廠類(介面或者抽象類)
package com.xxfamly.creational.factorymethod;
/** * 工廠
*/public inte***ce factory
假如說目前訂單需要生產賓士汽車,那麼我們建立具體的產品類和工廠類。
賓士汽車類
package com.xxfamly.creational.factorymethod;
/** * 具體產品類:賓士汽車
*/public class benzcar implements car
}
賓士工廠類,敲黑板:子類決定例項化哪乙個類。
package com.xxfamly.creational.factorymethod;
/** * 具體工廠類:賓士工廠
*/public class benzfactory implements factory
}
客戶端類
package com.xxfamly.creational.factorymethod;
/** * 模擬客戶端類
*/public class client
}
執行結果
賓士生產了
賓士發動了
process finished with exit code 0
檢視uml類圖
只生產了1種車型,無論從類圖還是**上,都看不出工廠模式有什麼優勢,我們接著往下看。
現在需求有擴充套件,需要生產別克車型並發動測試。這時候工廠模式的優勢就發揮出來了,我們只需要增加具體的產品類和工廠類即可,對原有程式沒有任何衝擊(客戶端除外)。
增加別克產品類
package com.xxfamly.creational.factorymethod;
/** * 具體產品類:別克汽車
*/public class buickcar implements car
}
增加別克工廠類
package com.xxfamly.creational.factorymethod;
/** * 具體工廠類:別克工廠
*/public class buickfactory implements factory
}
修改客戶端
package com.xxfamly.creational.factorymethod;
/** * 模擬客戶端類
*/public class client
}
執行結果
賓士生產了
賓士發動了
別克生產了
別克發動了
process finished with exit code 0
檢視uml類圖
從類圖和實際coding都可以看出我們前面所說的工廠方法模式的優點,理論上看可以橫行擴充套件很多產品類和工廠類來完成需求的不斷變化。
設計模式(三) 工廠方法模式
在設計模式 簡單工廠模式文章中介紹了簡單工廠模式,通過乙個例子講述了如何使用簡單工廠模式。同時也留下了乙個問題,那就是簡單工廠模式破壞了開放 封閉原則。那麼本文將介紹另外一種設計模式 工廠方法模式。主要介紹其概念 用途 實現方式 以及優缺點等。工廠方法模式 factory method patter...
設計模式(三) 工廠方法模式
工廠模式一般分為三種 簡單工廠,工廠方法,抽象工廠 簡單工廠 簡單工廠模式又叫靜態工廠方法模式,是通過專門定義乙個類負責建立其他類的例項,被建立的例項通常都具有共同的父類。簡單工廠將物件的建立過程進行了封裝,使用者不需要知道具體的建立過程,只需要呼叫工廠類獲取物件即可。工廠類的寫法是通過switch...
設計模式之(三) 工廠方法模式
女媧補天的故事大家都聽過吧,這個故事是說,女媧在補了天後,下到凡間一看,哇塞,風景太優美了,天空是湛 藍的,水是清澈的,空氣是清新的,太美麗了,然後就待時間長了就有點寂寞了,沒有動物,這些看的到 都是靜態的東西呀,怎麼辦?別忘了是神仙呀,沒有辦不到的事情,於是女媧就架起了八卦爐 技術術語 建立工廠 ...