www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]工廠模式有啥用啊,我的項(xiàng)目沒使用工廠模式也照樣運(yùn)行這是我聽過最令人哭笑不得的吐槽,這個(gè)程序猿的頭發(fā)不知道有沒有被自己薅禿的確,項(xiàng)目中不使用工廠模式并不會(huì)影響項(xiàng)目的運(yùn)行但是,當(dāng)項(xiàng)目后期需要二次開發(fā)時(shí),代碼的維護(hù)和修改的復(fù)雜度,絕對(duì)能讓你恨不得把自己頭發(fā)都薅禿下面我們就來盤一盤工廠模...

工廠模式有啥用啊,我的項(xiàng)目沒使用工廠模式也照樣運(yùn)行

這是我聽過最令人哭笑不得的吐槽,這個(gè)程序猿的頭發(fā)不知道有沒有被自己薅禿

的確,項(xiàng)目中不使用工廠模式并不會(huì)影響項(xiàng)目的運(yùn)行

但是,當(dāng)項(xiàng)目后期需要二次開發(fā)時(shí),代碼的維護(hù)和修改的復(fù)雜度,絕對(duì)能讓你恨不得把自己頭發(fā)都薅禿

下面我們就來盤一盤工廠模式能解決哪些問題

簡單工廠模式

實(shí)際案例

假如客戶有這樣一個(gè)需求,做一個(gè)用戶訂購手機(jī)來玩游戲的項(xiàng)目

項(xiàng)目中可以生產(chǎn)華為和小米的手機(jī),生產(chǎn)的手機(jī)只能用來玩游戲,用戶可以通過京東和淘寶來訂購手機(jī)

需求中的一個(gè)前置條件是手機(jī)只能用來玩游戲,不能做別的事情。這就類似于一個(gè)規(guī)范,所有的手機(jī)都要遵守這個(gè)規(guī)范。

制定規(guī)范是java中接口的特性,所以我們要定義一個(gè)接口基類,叫做Phone,里面有一個(gè)玩游戲的方法play()。

還要有華為手機(jī)和小米手機(jī)的類,分別叫做HuweiXiaomi,這兩個(gè)手機(jī)類要遵循手機(jī)只能用來玩游戲這個(gè)規(guī)范,所以它們要實(shí)現(xiàn)Phone類,并完成play()方法

新同事說工廠模式有啥用,別學(xué)了
用java代碼實(shí)現(xiàn)分別如下

phone基類

public?interface?Phone?{
????void?play();
}
華為手機(jī)類Huawei

public?class?Huawei?implements?Phone?{
????@Override
????public?void?play()?{
????????System.out.println("華為手機(jī)玩游戲");
????}
}
小米手機(jī)類Xiaomi

public?class?Xiaomi?implements?Phone?{
????@Override
????public?void?play()?{
????????System.out.println("小米手機(jī)玩游戲");
????}
}
用戶可以通過京東和淘寶來訂購手機(jī),所以還要有京東和淘寶的類,分別叫做JingdongTaobao。類里面各有一個(gè)訂購方法叫做order(),可以根據(jù)用戶的喜好來訂購不同的手機(jī)

如果用戶喜歡華為則訂購華為手機(jī)來玩游戲,如果用戶喜歡小米則訂購小米手機(jī)來玩游戲,其他的用戶就不能玩游戲

新同事說工廠模式有啥用,別學(xué)了
因?yàn)榫〇|類和淘寶類的代碼邏輯一摸一樣,這里只貼一下京東類的代碼

public?class?Jingdong?{
????public?void?order(String?type)?{
????????Phone?phone?=?null;
????????if?("huawei".equals(type))?{
????????????phone?=?new?Huawei();
????????????phone.play();
????????}?else?if?("xiaomi".equals(type))?{
????????????phone?=?new?Xiaomi();
????????????phone.play();
????????}?else?{
????????????System.out.println("暫不支持");
????????}
????}
}
這樣我們就實(shí)現(xiàn)了客戶的需求,而且沒有使用任何設(shè)計(jì)模式。

項(xiàng)目雖然可以完美的運(yùn)行,但是有一個(gè)問題值得我們思考,假如又增加了蘋果手機(jī),這時(shí)候我們的代碼該怎么修改

首先,我們肯定是要增加蘋果手機(jī)類IPhone,并且實(shí)現(xiàn)Phone基類

新同事說工廠模式有啥用,別學(xué)了
京東類中訂購方法的邏輯需要做出相應(yīng)的修改

新同事說工廠模式有啥用,別學(xué)了
淘寶類中訂購方法的邏輯也需要做出相應(yīng)的修改,修改的地方和京東類一模一樣。這時(shí)我們就發(fā)現(xiàn)同樣的代碼需要修改兩次。

新同事說工廠模式有啥用,別學(xué)了
如果訂購類有很多,除了京東、淘寶,還有拼多多、微信商城等等。那就意味著同樣的代碼不止要修改兩次,有多少個(gè)訂購類就需要修改多少次

這個(gè)工作量是很大的,而且極其容易出錯(cuò),就問你頭禿不頭禿

這時(shí)候就需要使用簡單工廠模式來優(yōu)化我們的代碼

簡單工廠模式就是創(chuàng)建一個(gè)工廠類,由這個(gè)類來封裝實(shí)例化對(duì)象的行為

套用到這個(gè)例子中就是:創(chuàng)建一個(gè)工廠類,由工廠類來封裝創(chuàng)建手機(jī)的邏輯。訂購類從工廠類中獲取手機(jī)對(duì)象直接使用,不再關(guān)心手機(jī)創(chuàng)建的過程

新同事說工廠模式有啥用,別學(xué)了
工廠類PhoneFactory用代碼實(shí)現(xiàn)就是這樣

public?class?PhoneFactory?{
????public?static?Phone?createPhone(String?type)?{
????????Phone?phone?=?null;
????????if?("huawei".equals(type))?{
????????????phone?=?new?Huawei();
????????}?else?if?("xiaomi".equals(type))?{
????????????phone?=?new?Xiaomi();
????????}?else?if?("apple".equals(type))?{
????????????phone?=?new?IPhone();
????????}?else?{
????????????System.out.println("暫不支持");
????????}
????????return?phone;
????}
}
京東、淘寶等訂購類從工廠類里面獲取手機(jī)對(duì)象后直接使用,不再關(guān)心手機(jī)的創(chuàng)建過程(京東和淘寶類的代碼一樣,這里只貼京東類的代碼)

public?class?Jingdong?{
????public?void?order(String?type)?{
????????Phone?phone?=?PhoneFactory.createPhone(type);
????????if?(phone?!=?null)?{
????????????phone.play();
????????}
????}
}
這就實(shí)現(xiàn)了簡單工廠模式,以后再需要增加手機(jī)型號(hào)時(shí)只需要修改工廠類就行了,其他代碼不用修改

簡單工廠模式總結(jié)

簡單工廠模式就是創(chuàng)建一個(gè)工廠類,根據(jù)傳入的參數(shù)類型來創(chuàng)建具體的產(chǎn)品對(duì)象,并返回產(chǎn)品對(duì)象的實(shí)例

主要適用于調(diào)用者不知道應(yīng)該創(chuàng)建哪個(gè)具體的對(duì)象,只能根據(jù)傳入的條件返回相應(yīng)對(duì)象的場景

比如案例中,訂購類是不知道要?jiǎng)?chuàng)建哪個(gè)手機(jī)對(duì)象的,只能根據(jù)用戶提供的條件才能知道需要哪個(gè)手機(jī)對(duì)象

簡單工廠模式的好處在于將對(duì)象的創(chuàng)建過程和使用過程進(jìn)行解耦,減少新增具體產(chǎn)品時(shí)修改代碼的復(fù)雜度

就像上面的例子一樣,對(duì)象的創(chuàng)建過程由工廠類負(fù)責(zé),訂購類不需要關(guān)心對(duì)象是怎么創(chuàng)建的,只需要從工廠類獲取對(duì)象來使用即可

當(dāng)需要增加手機(jī)對(duì)象時(shí),只需要修改工廠類,而不需要對(duì)每一個(gè)訂購類進(jìn)行修改

簡單工廠模式的缺點(diǎn)在于每次新增具體產(chǎn)品時(shí),都需要修改工廠類,這違背了設(shè)計(jì)模式中的開閉原則。而且當(dāng)具體的產(chǎn)品比較多時(shí),工廠類的if-else判斷就會(huì)比較多,代碼不美觀

工廠方法模式

實(shí)際案例

基于剛才用戶訂購手機(jī)玩游戲的需求,我們稍微改動(dòng)一下。

為了實(shí)現(xiàn)精準(zhǔn)營銷,京東、淘寶等商城分別上線了華為專賣店、小米專賣店和蘋果專賣店

當(dāng)用戶進(jìn)入華為專賣店,就默認(rèn)用戶要訂購華為手機(jī);當(dāng)用戶進(jìn)入小米專賣店,就默認(rèn)用戶要訂購小米手機(jī);當(dāng)用戶進(jìn)入蘋果專賣店,就默認(rèn)用戶要訂購蘋果手機(jī)

新同事說工廠模式有啥用,別學(xué)了
這個(gè)需求用剛才我們講的簡單工廠模式也可以實(shí)現(xiàn)

但是簡單工廠的缺點(diǎn)也很明顯,當(dāng)新增粉絲類型時(shí)需要修改工廠類,當(dāng)粉絲類型過多時(shí)工廠類的邏輯就會(huì)比較繁雜

比如新增了vivo粉絲,工廠類就需要新增判斷條件去創(chuàng)建vivo手機(jī)對(duì)象;新增了oppo手機(jī),工廠類就要新增判斷條件去創(chuàng)建oppo手機(jī)對(duì)象。一直不斷的新增下去的話,就會(huì)導(dǎo)致工廠類的中的判斷過多,代碼很長,后期不容易維護(hù)

而且,簡單工廠模式是適用于調(diào)用者不知道應(yīng)該創(chuàng)建哪種對(duì)象的場景。

在這個(gè)需求中,京東等訂購類中為不同的粉絲提供了專賣店,假如專賣店是訂購類中的一個(gè)方法的話,在專賣店這個(gè)方法中是知道應(yīng)該創(chuàng)建什么樣的對(duì)象的。比如,在華為手機(jī)的訂購方法中,是知道要?jiǎng)?chuàng)建華為手機(jī)對(duì)象的

所以,這個(gè)需求可以用工廠方法模式來實(shí)現(xiàn)

工廠方法模式和簡單工廠模式相似,也需要有一個(gè)工廠類。不過在工廠方法模式中,工廠類不再負(fù)責(zé)創(chuàng)建對(duì)象。因?yàn)樵诿總€(gè)訂購方法中已經(jīng)知道應(yīng)該創(chuàng)建哪個(gè)手機(jī)對(duì)象,所以創(chuàng)建對(duì)象的邏輯下沉到訂購類的方法中

新同事說工廠模式有啥用,別學(xué)了
工廠類只負(fù)責(zé)制定規(guī)范,來約束每個(gè)產(chǎn)品的具體行為,所以工廠類是一個(gè)接口基類。每個(gè)對(duì)應(yīng)的產(chǎn)品需要有一個(gè)自己的工廠,來繼承這個(gè)基類,達(dá)到約束自身行為的目的

這個(gè)需求中工廠基類規(guī)定每個(gè)工廠只能有一個(gè)方法,這個(gè)方法的作用就是創(chuàng)建手機(jī)對(duì)象

新同事說工廠模式有啥用,別學(xué)了
工廠基類PhoneFactory用代碼實(shí)現(xiàn)

public?interface?PhoneFactory?{
???Phone?createPhone();
}
華為工廠類用代碼實(shí)現(xiàn)

public?class?HuaweiFactory?implements?PhoneFactory?{
???@Override
???public?Phone?createPhone()?{
??????return?new?Huawei();
???}
}
小米工廠類用代碼實(shí)現(xiàn)

public?class?XiaomiFactory?implements?PhoneFactory?{
???@Override
???public?Phone?createPhone()?{
??????return?new?Xiaomi();
???}
}
在訂購類中,不同的訂購方法調(diào)用不同的工廠獲取對(duì)象。比如京東訂購類的代碼如下(淘寶訂購類處理邏輯類似,這里不再貼淘寶類的代碼

public?class?Jingdong?{
????//?華為粉絲訂購華為手機(jī)
????public?void?orderHuawei()?{
????????PhoneFactory?phoneFactory?=?new?HuaweiFactory();
????????Phone?phone?=?phoneFactory.createPhone();
????????phone.play();
????}
????//?小米粉絲訂購小米手機(jī)
????public?void?orderXiaomi()?{
????????PhoneFactory?phoneFactory?=?new?XiaomiFactory();
????????Phone?phone?=?phoneFactory.createPhone();
????????phone.play();
????}
}
這樣我們就用工廠方法模式實(shí)現(xiàn)了為不同粉絲訂購不同手機(jī)的需求

工廠方法模式總結(jié)

工廠方法模式是定義一個(gè)工廠接口基類,基類中定義一個(gè)創(chuàng)建產(chǎn)品的抽象方法。每個(gè)產(chǎn)品需要有自己的工廠來實(shí)現(xiàn)這個(gè)基類,并完成創(chuàng)建對(duì)應(yīng)產(chǎn)品實(shí)例的方法,由具體的產(chǎn)品調(diào)用該方法來創(chuàng)建對(duì)象

它主要適用于調(diào)用者已經(jīng)明確知道需要?jiǎng)?chuàng)建哪一個(gè)具體產(chǎn)品的場景

比如,針對(duì)華為的粉絲,已經(jīng)明確知道要?jiǎng)?chuàng)建華為的手機(jī)產(chǎn)品

工廠方法模式的優(yōu)勢(shì)在于完全符合了開閉原則,在新增產(chǎn)品時(shí)不需要再改動(dòng)已存在的代碼,使工廠類和產(chǎn)品類的代碼完全解耦,更利于程序的擴(kuò)展

他的缺點(diǎn)也很明顯,當(dāng)新增產(chǎn)品時(shí),需要同時(shí)新增產(chǎn)品類和工廠類,導(dǎo)致系統(tǒng)中的類是成對(duì)增加,增加了系統(tǒng)的復(fù)雜度

抽象工廠模式

實(shí)際案例

基于工廠方法模式的案例,我們?cè)龠M(jìn)一步擴(kuò)展

用戶不單單想訂購手機(jī)來玩游戲,還想訂購ipad和電腦

可以用剛才講的工廠方法模式來實(shí)現(xiàn):我們不僅需要提供手機(jī)工廠的基類,還需要提供ipad工廠基類和電腦工廠基類,并且為每個(gè)工廠基類提供具體的工廠實(shí)現(xiàn)類

新同事說工廠模式有啥用,別學(xué)了
訂購類方法中,根據(jù)不同的需求來創(chuàng)建不同的產(chǎn)品供用戶使用

新同事說工廠模式有啥用,別學(xué)了
這樣實(shí)現(xiàn)的代碼沒有問題,但是不符合我們真實(shí)開發(fā)中的業(yè)務(wù)場景

在實(shí)際業(yè)務(wù)場景中,京東商城的華為專賣店想要訂購手機(jī)不需要到華為公司的手機(jī)部門去訂購吧?想要訂購ipad不需要到華為公司的ipad部門訂購吧?想要訂購電腦也不需要到華為公司的電腦部門訂購吧?

京東商城的華為專賣店應(yīng)該只負(fù)責(zé)和華為公司對(duì)接,和具體的業(yè)務(wù)部門沒關(guān)系。專賣店想要訂購某個(gè)產(chǎn)品去告訴華為公司,由公司去給具體的業(yè)務(wù)部門溝通

所以,從實(shí)際的使用場景出發(fā),我們的代碼應(yīng)該這樣設(shè)計(jì)

新同事說工廠模式有啥用,別學(xué)了
不再使用單獨(dú)的手機(jī)工廠、ipad工廠和PC工廠,而是把同一個(gè)廠家作為工廠,由工廠分別創(chuàng)建不同的產(chǎn)品

Factory基類實(shí)現(xiàn)代碼如下

public?interface?Factory?{
????Phone?createPhone();
????IPad?createIPad();
????PC?createPC();
}
華為工廠類實(shí)現(xiàn)代碼如下

public?class?HuaweiFactory?implements?Factory?{
????@Override
????public?Phone?createPhone()?{
????????return?new?HuaweiPhone();
????}
????@Override
????public?IPad?createIPad()?{
????????return?new?HuaweiIPad();
????}
????@Override
????public?PC?createPC()?{
????????return?new?HuaweiPC();
????}
}
小米工廠實(shí)現(xiàn)代碼如下

public?class?XiaomiFactory?implements?Factory?{
????@Override
????public?Phone?createPhone()?{
????????return?new?XiaomiPhone();
????}
????@Override
????public?IPad?createIPad()?{
????????return?new?XiaomiIPad();
????}
????@Override
????public?PC?createPC()?{
????????return?new?XiaomiPC();
????}
}
在京東訂購類中,我們只需要?jiǎng)?chuàng)建對(duì)應(yīng)的工廠對(duì)象,由工廠對(duì)象創(chuàng)建不同的產(chǎn)品

public?class?Jingdong?{
????//?華為粉絲訂購手機(jī)、ipad、電腦
????public?void?orderHuawei()?{
????????Factory?factory?=?new?HuaweiFactory();
????????Phone?phone?=?factory.createPhone();
????????phone.play();
????????IPad?ipad?=?factory.createIPad();
????????ipad.play();
????????PC?pc?=?factory.createPC();
????????pc.play();
????}
????//?小米粉絲訂購手機(jī)、ipad、電腦
????public?void?orderXiaomi()?{
????????Factory?factory?=?new?XiaomiFactory();
????????Phone?phone?=?factory.createPhone();
????????phone.play();
????????IPad?ipad?=?factory.createIPad();
????????ipad.play();
????????PC?pc?=?factory.createPC();
????????pc.play();
????}
}
這樣我們就用抽象工廠模式實(shí)現(xiàn)了用戶訂購手機(jī)、ipad和電腦的需求

抽象工廠模式總結(jié)

抽象工廠模式是將具有一定共性的產(chǎn)品封裝到一塊,由工廠類分別為這些產(chǎn)品提供創(chuàng)建對(duì)象的方法,調(diào)用者可以根據(jù)不同的需求調(diào)用工廠類的具體方法來獲得產(chǎn)品實(shí)例

比如案例中華為的手機(jī)、ipad和電腦都屬于華為公司產(chǎn)品,所以可以由華為工廠類來負(fù)責(zé)分別創(chuàng)建不同的對(duì)象

它的優(yōu)勢(shì)在于將具有一定共性的產(chǎn)品集合封裝到一起,在實(shí)際開發(fā)中更符合具體的業(yè)務(wù)場景

他的缺點(diǎn)就是降低了系統(tǒng)的擴(kuò)展性,當(dāng)新增產(chǎn)品時(shí)需要修改工廠類,在工廠類的基類和實(shí)現(xiàn)類中都需要增加對(duì)應(yīng)的方法

比如說,用戶也想訂購VR眼鏡來玩游戲。那么工廠基類中需要增加創(chuàng)建VR眼鏡的方法,所有的工廠實(shí)現(xiàn)類中都需要增加對(duì)該方法的實(shí)現(xiàn),系統(tǒng)擴(kuò)展性比較差

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉