本篇文章帶大家了解一下PHP設計模式中的簡單工廠模式。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
先從簡單工廠入門,不管是面試還是被他人面試,在問到設計模式的時候,大多數人都會提到工廠模式。毫無疑問,工廠相關的幾種模式在設計模式中最有名的也是應用比較廣泛的一種模式。在GoF設計模式中也都是屬於創建型的模式。
但是,能夠說明白簡單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官刮目相看。這裡有個前提,是你真的能說明白,大部分人,包括在深入研究設計模式之前,我也沒辦法說清楚。不管是我去面試,還是面試別人。當我面試別人的時候,能講個大概也就差不多了。而我去面試的時候,也就是類似的講個大概。經歷不少挫折之後才有了想深入的研究研究設計模式的想法,於是便會產生這一系列的文章。從這篇簡單工廠開始,我們一起再次深入的設計模式學習。
簡單工廠,也稱為靜態工廠,不屬於GoF23種設計模式。但可以說是所有的設計模式中大家可能最容易理解,也可能在你的程式碼中早就已經用過不知道多少次的一種設計模式了。我們先從一個最簡單的程式碼段來看。
// 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介面的實作。
在這段程式碼中,使用了PHP新特性,參數類型及返回值類型
##產品接口和產品實作// 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();從以上程式碼可以看出,其實這裡就是一個工廠類別根據我們傳入的字串或其他你自己定義的標識符,來傳回對應的產品(Product物件)。
形象化一點的比喻:我是一個賣手機的批發商(客戶Client,業務方),我需要一批手機(產品Product),於是我去讓富士康(工廠Factory)來幫我生產。我下了訂單($type變數)指明型號,然後富士康就給我對應型號的手機,然後我就繼續我的工作了,和富士康的合作還真是挺愉快的。
這裡比較規範的寫法可能是所有產品都會去實作一個統一的接口,然後客戶端只知道接口的方法統一呼叫即可。不規範的話也可以不使用接口,返回各種不同的對象,類似於外觀(Facade)模式進行統一的門面管理。原始碼位址:簡單工廠基礎類別圖實作https://github.com/zhangyue0503/designpatterns-php/blob/master /01.simple-factory/source/simple-factory.php
類別圖:
#程式碼:
<?php interface Message { public function send(string $msg); } class AliYunMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg; } } class BaiduYunMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '百度SMS短信发送成功!短信内容:' . $msg; } } class JiguangMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '极光短信发送成功!短信内容:' . $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; } } } // 当前业务需要使用极光 $message = MessageFactory::createMessage('Ali'); echo $message->send('您有新的短消息,请查收');
#原始碼位址:簡單工廠實例-簡訊發送工廠https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory-message.php
說明#
推薦學習:《PHP影片教學》
以上是淺談PHP中的簡單工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!