1耐版、是什么--概念
工廠方法模式,又稱工廠模式压汪、多態(tài)工廠模式和虛擬構造器模式粪牲,通過定義工廠父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象止剖。
是一種常用的類創(chuàng)建型設計模式,此模式的核心精神是封裝類中變化的部分腺阳,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦穿香、復用和方便后期維護拓展的目的亭引。
2、為什么--產生動機
根據簡單工廠模式可以看出皮获,不同品牌的汽車是由不同的工廠生產的焙蚓,貌似又是很完美的。但大家看一下測試類洒宝,當一個人想要去買一輛寶馬汽車的時候(假設沒有銷售商)购公,那么他就要去找寶馬工廠給他生產一輛,過幾天又想要買一輛奔馳汽車的時候雁歌,又得跑到奔馳工廠請人生產宏浩,這無疑就增加了用戶的操作復雜性。所以有沒有一種方便用戶操作的方法呢靠瞎?這個時候抽象工廠模式就出現了比庄。
3、怎么做--功能說明和代碼實現
工廠方法模式組成:
1)抽象工廠角色: 這是工廠方法模式的核心乏盐,它與應用程序無關佳窑。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現父能。
2)具體工廠角色:它含有和具體業(yè)務邏輯有關的代碼神凑。由應用程序調用以創(chuàng)建對應的具體產品的對象。
3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口法竞。在java中一般有抽象類或者接口來實現耙厚。
4)具體產品角色:具體工廠角色所創(chuàng)建的對象就是此角色的實例。在java中由具體的類來實現岔霸。
業(yè)務邏輯:
業(yè)務描述:
(1)蘋果薛躬,香蕉,鴨梨屬于具體的產品呆细;
(2)蘋果型宝,香蕉等具體水果抽象出一個產品,是它們都屬于水果絮爷;
(3)蘋果工廠等屬于具體工廠角色趴酣,用來指定生產的水果;
(4)同樣坑夯,將不同的工廠抽象出一個水果工廠岖寞,所有的工廠都繼承該工廠;
具體實現參照github庫源碼柜蜈,地址如下:
https://github.com/zhaoyan1990/designModel
4仗谆、解決問題
當一個類無法預料要創(chuàng)建哪種類的對象或是一個類需要由子類來指定,創(chuàng)建的對象時淑履,就需要用到工廠模式隶垮。
工廠方法模式去掉了簡單工廠模式中工廠方法的靜態(tài)屬性,使得它可以被子類繼承秘噪。這樣在簡單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類來分擔狸吞。
5、使用場景
(1)消費者不關心它所要創(chuàng)建對象的類(產品類)的時候指煎。
(2)消費者知道它所要創(chuàng)建對象的類(產品類)蹋偏,但不關心如何創(chuàng)建的時候。
例如:hibernate里通過sessionFactory創(chuàng)建session贯要、通過代理方式生成ws客戶端時暖侨,通過工廠構建報文中格式化數據的對象。
6崇渗、總結
這種工廠方法字逗,如果后期還有新的具體產品,只需要繼承水果這個類(抽象產品)宅广,然后定義新的工廠葫掉, 同樣是實現FactoryFruit這個接口(工廠接口),生產具體的產品就ok了跟狱。這樣就符合開閉原則俭厚,對擴展開發(fā),修改關閉驶臊。 而簡單工廠方法:如果后期有新的產品挪挤,產品同樣可以繼承Fruit這個類(抽象產品)叼丑, 但是,如果要得到這個具體的產品時扛门,需要在原來工廠類中修改代碼鸠信,添加一個新產品的方法, 這樣就修改了原來的代碼论寨,這就不符合開閉原則了星立。
當一個人想要蘋果的時候,那么他就要去找蘋果工廠給他生產一個葬凳,過幾天又想要一個香蕉的時候绰垂,又得跑到香蕉工廠請人生產,這無疑就增加了用戶的操作復雜性火焰。所以有沒有一種方便用戶操作的方法呢劲装?這個時候抽象工廠模式就出現了。
<鼋 =闯!江场!CSDN中也有我的身影