小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PHP設(shè)計模式之簡單工廠模式

 硬核項目經(jīng)理 2021-05-31

PHP設(shè)計模式之簡單工廠模式

先從簡單工廠入門,不管是面試還是被他人面試,在問到設(shè)計模式的時候,大多數(shù)人都會提到工廠模式。毫無疑問,工廠相關(guān)的幾種模式在設(shè)計模式中是最出名的也是應(yīng)用比較廣泛的一種模式。在GoF設(shè)計模式中也都是屬于創(chuàng)建型的模式。

但是,能夠說明白簡單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官刮目相看。這里有個前提,是你真的能說明白,大部分人,包括在深入研究設(shè)計模式之前,我也沒辦法說清楚。不管是我去面試,還是面試其別人。當我面試別人的時候,能講個大概也就差不多了。而我去面試的時候,也就是類似的講個大概。經(jīng)歷不少挫折之后才有了想深入的研究研究設(shè)計模式的想法,于是便會產(chǎn)生這一系列的文章。從這篇簡單工廠開始,我們一起再次深入的對設(shè)計模式進行學(xué)習(xí)。

當然,這里用的是PHP。

解釋

簡單工廠,也稱靜態(tài)工廠,不屬于GoF23種設(shè)計模式。但是可以說是所有的設(shè)計模式中大家可能最容易理解,也可能在你的代碼中早就已經(jīng)用過不知道多少次的一種設(shè)計模式了。我們先從一個最最簡單的代碼段來看。

// 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;
}
}

沒錯,核心點就是中間那段簡單的switch代碼,我們在返回值類型中固定為Product接口的實現(xiàn)。

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

產(chǎn)品接口和產(chǎn)品實現(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';
}
}

最后客戶端的使用就很簡單了

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

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

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

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

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

實例

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

類圖

代碼

<?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;
}
}
}

// 當前業(yè)務(wù)需要使用極光
$message = MessageFactory::createMessage('Ali');
echo $message->send('您有新的短消息,請查收');

源碼地址:簡單工廠實例-短信發(fā)送工廠

說明

  • createMessage一定要使用static?不一定,看自己業(yè)務(wù)情況決定,需要常駐的全部static,按需實例化的就new完了再正常->去調(diào)用

  • 三個message子類一定需要實現(xiàn)接口?也不一定,php本身就是弱類型語言,可以不去強制實現(xiàn),但使用接口更加符合面向?qū)ο蟮囊?guī)范(請參考多態(tài)),簡單工廠本身其實是對多態(tài)的一種表述和應(yīng)用

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

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

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

  • 實例中傳錯了$type返回NULL怎么辦?親,實際寫代碼的時候請?zhí)幚砗眠@個問題喲,返回一個默認的,或者上層捕獲都是不錯的解決方案,當然最好客戶端那邊提前判斷好,沒問題了再進工廠吧

下期看點

工廠方法模式,接著發(fā)短信,但這回我們讓客戶端換個姿勢來發(fā)

GitHub地址:https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/blog.md

點擊【查看原文】進入GitHub原文鏈接!

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多