工廠模式的好處就在于將工廠和產品之間的耦合降低,將具體產品的構造過程放在了具體工廠類里面朴译。在以后擴展產品的時候方便很多井佑,只需要添加一個工廠類,一個產品類眠寿,就能方便的添加產品躬翁,而不需要修改原有的代碼。而在簡單工廠中盯拱,如果要增加一個產品盒发,則需要修改工廠類,增加if/else分支坟乾,或者增加一個case分支迹辐,工廠模式符合軟件開發(fā)中的OCP原則(open close principle),對擴展開放甚侣,對修改關閉。
抽象工廠模式:這個模式我總是感覺和builder模式非常相似间学。
工廠方法模式提供的是對一個產品的等級模式殷费,而抽象工廠方法提供的是對多個產品的等級模式印荔,注意,這里的多個具體產品之間是相互耦合的详羡,也就是說這里的抽象工廠提供的產品之間是存在某種聯(lián)系的仍律。
有人做如下的比較:
工廠方法模式:一個抽象產品類,可以派生出多個具體產品類实柠。
一個抽象工廠類水泉,可以派生出多個具體工廠類。
每個具體工廠類只能創(chuàng)建一個具體產品類的實例窒盐。
抽象工廠模式:多個抽象產品類草则,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類蟹漓,可以派生出多個具體工廠類炕横。
每個具體工廠類可以創(chuàng)建多個具體產品類的實例。
區(qū)別:工廠方法模式只有一個抽象產品類葡粒,而抽象工廠模式有多個份殿。
工廠方法模式的具體工廠類只能創(chuàng)建一個具體產品類的實例,而抽象工廠模式可以創(chuàng)建多個嗽交。
下面是一個形象的比喻:
無論是簡單工廠模式卿嘲、工廠模式還是抽象工廠模式,它們本質上都是將不變的部分提取出來夫壁,將可變的部分留作接口拾枣,以達到最大程度上的復用。拿一個生產水杯(cup)的工廠舉例:起初掌唾,不用工廠模式放前,我必須在生產水杯之前知道水杯的材料和形狀等水杯的所有特征才能生產,這就是我們的new Cup();這個Cup必須是具體的糯彬。廠主發(fā)現(xiàn)同一形狀的被子凭语,只是材料不同,如一個是玻璃(glass)的,一個是瓷(china)的,但是確要兩條生產線撩扒,顯然有資源浪費的嫌疑∷迫樱現(xiàn)在廠主生產杯子時先不讓生產線知道我要產的是玻璃的還是瓷的,而是讓它在不知道具體材料的情況下先做它能做的搓谆,等到它把模具做好炒辉,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形狀的具體杯子了。但是很可惜泉手,java并不能new一個抽象的Cup黔寇,所以就有了簡單工廠模式。原來是Cup cup=new Cup;現(xiàn)在是SimpleCupFactory.createCup(String cupName),根據(jù)cup的名字生產Cup,而createCup返回的是一個實現(xiàn)了 Cup接口或抽象類的具體Cup斩萌。簡單抽象工廠模式有一個問題缝裤,就是當我現(xiàn)在想生產一個同樣形狀的鐵杯時屏轰,工廠里并沒有定義相應的處理流程,只能更改createCup方法憋飞,這就不合理了霎苗。我現(xiàn)在只是想生產鐵杯,你只要在最后的時候把玻璃原料換成鐵的不就行了嗎榛做,干嘛還要更改整條生產線呢唁盏?于是就有了工廠模式。原來生產線在生產模具的時候還要考慮是為玻璃杯生產的模具還是為鐵杯生產的模具检眯,現(xiàn)在它不用管了厘擂。CupFactory.createCup()創(chuàng)建Cup.CupFactory是接口或抽象類。實現(xiàn)它的具體子類會創(chuàng)建符合Cup接口的具體Cup轰传。那么現(xiàn)在廠主想要生產水壺(kettle)驴党,用工廠模式就不得不再造一條水壺生產線,能不能在水杯生產線同時生產水壺呢获茬?這就是抽象工廠模式港庄。