這篇文章主要講解了“PHP中的工廠模式是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“PHP中的工廠模式是什么”吧!
成都創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今,先為靈丘等服務(wù)建站,靈丘等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為靈丘企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
先從簡(jiǎn)單工廠入門(mén),不管是面試還是被他人面試,在問(wèn)到設(shè)計(jì)模式的時(shí)候,大多數(shù)人都會(huì)提到工廠模式。毫無(wú)疑問(wèn),工廠相關(guān)的幾種模式在設(shè)計(jì)模式中是最出名的也是應(yīng)用比較廣泛的一種模式。在GoF設(shè)計(jì)模式中也都是屬于創(chuàng)建型的模式。
但是,能夠說(shuō)明白簡(jiǎn)單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官刮目相看。這里有個(gè)前提,是你真的能說(shuō)明白,大部分人,包括在深入研究設(shè)計(jì)模式之前,我也沒(méi)辦法說(shuō)清楚。不管是我去面試,還是面試其別人。當(dāng)我面試別人的時(shí)候,能講個(gè)大概也就差不多了。而我去面試的時(shí)候,也就是類(lèi)似的講個(gè)大概。經(jīng)歷不少挫折之后才有了想深入的研究研究設(shè)計(jì)模式的想法,于是便會(huì)產(chǎn)生這一系列的文章。從這篇簡(jiǎn)單工廠開(kāi)始,我們一起再次深入的對(duì)設(shè)計(jì)模式進(jìn)行學(xué)習(xí)。
簡(jiǎn)單工廠,也稱(chēng)靜態(tài)工廠,不屬于GoF23種設(shè)計(jì)模式。但是可以說(shuō)是所有的設(shè)計(jì)模式中大家可能最容易理解,也可能在你的代碼中早就已經(jīng)用過(guò)不知道多少次的一種設(shè)計(jì)模式了。我們先從一個(gè)最最簡(jiǎn)單的代碼段來(lái)看。
// Factory class Factory { public static function createProduct(string $type) : Product { $product = null; switch ($type) { case 'A': $product = new ProductA(); break; case 'B': $product = new ProductB(); break; } return $product; } }
沒(méi)錯(cuò),核心點(diǎn)就是中間那段簡(jiǎn)單的switch代碼,我們?cè)诜祷刂殿?lèi)型中固定為Product接口的實(shí)現(xiàn)。
在這段代碼中,使用了PHP新特性,參數(shù)類(lèi)型及返回值類(lèi)型
產(chǎn)品接口和產(chǎn)品實(shí)現(xiàn)
// Products interface Product { public function show(); } class ProductA implements Product { public function show() { echo 'Show ProductA'; } } class ProductB implements Product { public function show() { echo 'Show ProductB'; } }
最后客戶(hù)端的使用就很簡(jiǎn)單了
// Client $productA = Factory::createProduct('A'); $productB = Factory::createProduct('B'); $productA->show(); $productB->show();
從以上代碼可以看出,其實(shí)這里就是一個(gè)工廠類(lèi)根據(jù)我們傳入的字符串或者其他你自己定義的標(biāo)識(shí)符,來(lái)返回對(duì)應(yīng)的產(chǎn)品(Product對(duì)象)。
形象化一點(diǎn)的比喻:我是一個(gè)賣(mài)手機(jī)的批發(fā)商(客戶(hù)Client,業(yè)務(wù)方),我需要一批手機(jī)(產(chǎn)品Product),于是我去讓富士康(工廠Factory)來(lái)幫我生產(chǎn)。我下了訂單($type變量)指明型號(hào),然后富士康就給我對(duì)應(yīng)型號(hào)的手機(jī),然后我就繼續(xù)我的工作了,和富士康的合作還真是挺愉快的。
這里比較規(guī)范的寫(xiě)法可能是所有產(chǎn)品都會(huì)去實(shí)現(xiàn)一個(gè)統(tǒng)一的接口,然后客戶(hù)端只知道接口的方法統(tǒng)一調(diào)用即可。不規(guī)范的話也可以不使用接口,返回各種不同的對(duì)象,類(lèi)似于外觀(Facade)模式進(jìn)行統(tǒng)一的門(mén)面管理。
源碼地址:簡(jiǎn)單工廠基礎(chǔ)類(lèi)圖實(shí)現(xiàn)
https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory.php
場(chǎng)景:短信發(fā)送功能模塊?,F(xiàn)在我們使用了三個(gè)商家的,分別是阿里云、蝶信、極光的短信服務(wù),在不同業(yè)務(wù)中可能使用不同的短信發(fā)送商,使用簡(jiǎn)單工廠可以方便的完成這個(gè)需求。
類(lèi)圖:
代碼:
send('您有新的短消息,請(qǐng)查收');
源碼地址:簡(jiǎn)單工廠實(shí)例-短信發(fā)送工廠
https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory-message.php
說(shuō)明
createMessage一定要使用static?不一定,看自己業(yè)務(wù)情況決定,需要常駐的全部static,按需實(shí)例化的就new完了再正常->去調(diào)用
三個(gè)message子類(lèi)一定需要實(shí)現(xiàn)接口?也不一定,php本身就是弱類(lèi)型語(yǔ)言,可以不去強(qiáng)制實(shí)現(xiàn),但使用接口更加符合面向?qū)ο蟮囊?guī)范(請(qǐng)參考多態(tài)),簡(jiǎn)單工廠本身其實(shí)是對(duì)多態(tài)的一種表述和應(yīng)用
當(dāng)需要增加發(fā)送消息的渠道時(shí),添加新類(lèi)繼承Message接口,實(shí)現(xiàn)send()方法,修改MessageFactory()中createFactory()方法里的switch
思考上述修改違背了面向?qū)ο蟮氖裁丛瓌t?(提示:開(kāi)放XX)
實(shí)例中沒(méi)有使用返回值類(lèi)型?本身這也是新語(yǔ)法,對(duì)于老版本兼容來(lái)說(shuō)可以不需要去寫(xiě),但是如果公司技術(shù)棧已經(jīng)升級(jí)到7以上的話,建議這種設(shè)計(jì)模式架構(gòu)類(lèi)的代碼還是按照上方解釋中的新特性寫(xiě)法去書(shū)寫(xiě),也就是帶上參數(shù)類(lèi)型和返回值類(lèi)型,更加的符合規(guī)范,也更容易理解
實(shí)例中傳錯(cuò)了$type返回NULL怎么辦?親,實(shí)際寫(xiě)代碼的時(shí)候請(qǐng)?zhí)幚砗眠@個(gè)問(wèn)題喲,返回一個(gè)默認(rèn)的,或者上層捕獲都是不錯(cuò)的解決方案,當(dāng)然最好客戶(hù)端那邊提前判斷好,沒(méi)問(wèn)題了再進(jìn)工廠吧
感謝各位的閱讀,以上就是“PHP中的工廠模式是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)PHP中的工廠模式是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!