溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中的工廠模式是什么

發(fā)布時(shí)間:2021-06-17 10:20:52 來(lái)源:億速云 閱讀:86 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“PHP中的工廠模式是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“PHP中的工廠模式是什么”吧!

先從簡(jiǎ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í)候,也就是類似的講個(gè)大概。經(jīng)歷不少挫折之后才有了想深入的研究研究設(shè)計(jì)模式的想法,于是便會(huì)產(chǎn)生這一系列的文章。從這篇簡(jiǎn)單工廠開始,我們一起再次深入的對(duì)設(shè)計(jì)模式進(jìn)行學(xué)習(xí)。

當(dāng)然,這里用的是PHP。

解釋

簡(jiǎn)單工廠,也稱靜態(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è)诜祷刂殿愋椭泄潭镻roduct接口的實(shí)現(xiàn)。

在這段代碼中,使用了PHP新特性,參數(shù)類型返回值類型

產(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';
    }
}

最后客戶端的使用就很簡(jiǎn)單了

// Client
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();

從以上代碼可以看出,其實(shí)這里就是一個(gè)工廠類根據(jù)我們傳入的字符串或者其他你自己定義的標(biāo)識(shí)符,來(lái)返回對(duì)應(yīng)的產(chǎn)品(Product對(duì)象)。

形象化一點(diǎn)的比喻:我是一個(gè)賣手機(jī)的批發(fā)商(客戶Client,業(yè)務(wù)方),我需要一批手機(jī)(產(chǎn)品Product),于是我去讓富士康(工廠Factory)來(lái)幫我生產(chǎn)。我下了訂單($type變量)指明型號(hào),然后富士康就給我對(duì)應(yīng)型號(hào)的手機(jī),然后我就繼續(xù)我的工作了,和富士康的合作還真是挺愉快的。

這里比較規(guī)范的寫法可能是所有產(chǎn)品都會(huì)去實(shí)現(xiàn)一個(gè)統(tǒng)一的接口,然后客戶端只知道接口的方法統(tǒng)一調(diào)用即可。不規(guī)范的話也可以不使用接口,返回各種不同的對(duì)象,類似于外觀(Facade)模式進(jìn)行統(tǒng)一的門面管理。

PHP中的工廠模式是什么

源碼地址:簡(jiǎn)單工廠基礎(chǔ)類圖實(shí)現(xiàn)

https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory.php

實(shí)例

場(chǎng)景:短信發(fā)送功能模塊。現(xiàn)在我們使用了三個(gè)商家的,分別是阿里云、蝶信、極光的短信服務(wù),在不同業(yè)務(wù)中可能使用不同的短信發(fā)送商,使用簡(jiǎn)單工廠可以方便的完成這個(gè)需求。

類圖:

PHP中的工廠模式是什么

代碼:

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 調(diào)用接口,發(fā)送短信
        // xxxxx
        return '阿里云短信(原阿里大魚)發(fā)送成功!短信內(nèi)容:' . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 調(diào)用接口,發(fā)送短信
        // xxxxx
        return '百度SMS短信發(fā)送成功!短信內(nèi)容:' . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 調(diào)用接口,發(fā)送短信
        // xxxxx
        return '極光短信發(fā)送成功!短信內(nèi)容:' . $msg;
    }
}

Class MessageFactory {
    public static function createFactory($type){
        switch($type){
            case 'Ali':
                return new AliYunMessage();
            case 'BD':
                return new BaiduYunMessage();
            case 'JG':
                return new JiguangMessage();
            default:
                return null;
        }
    }
}

// 當(dāng)前業(yè)務(wù)需要使用極光
$message = MessageFactory::createMessage('Ali');
echo $message->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子類一定需要實(shí)現(xiàn)接口?也不一定,php本身就是弱類型語(yǔ)言,可以不去強(qiáng)制實(shí)現(xiàn),但使用接口更加符合面向?qū)ο蟮囊?guī)范(請(qǐng)參考多態(tài)),簡(jiǎn)單工廠本身其實(shí)是對(duì)多態(tài)的一種表述和應(yīng)用

  • 當(dāng)需要增加發(fā)送消息的渠道時(shí),添加新類繼承Message接口,實(shí)現(xiàn)send()方法,修改MessageFactory()中createFactory()方法里的switch

  • 思考上述修改違背了面向?qū)ο蟮氖裁丛瓌t?(提示:開放XX)

  • 實(shí)例中沒(méi)有使用返回值類型?本身這也是新語(yǔ)法,對(duì)于老版本兼容來(lái)說(shuō)可以不需要去寫,但是如果公司技術(shù)棧已經(jīng)升級(jí)到7以上的話,建議這種設(shè)計(jì)模式架構(gòu)類的代碼還是按照上方解釋中的新特性寫法去書寫,也就是帶上參數(shù)類型和返回值類型,更加的符合規(guī)范,也更容易理解

  • 實(shí)例中傳錯(cuò)了$type返回NULL怎么辦?親,實(shí)際寫代碼的時(shí)候請(qǐng)?zhí)幚砗眠@個(gè)問(wèn)題喲,返回一個(gè)默認(rèn)的,或者上層捕獲都是不錯(cuò)的解決方案,當(dāng)然最好客戶端那邊提前判斷好,沒(méi)問(wèn)題了再進(jìn)工廠吧

感謝各位的閱讀,以上就是“PHP中的工廠模式是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)PHP中的工廠模式是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI