先從簡單工廠入門,不管是面試還是被他人面試,在問到設計模式的時候,大多數人都會提到工廠模式,毫無疑問,工廠相關的幾種模式在設計模式中是最出名的也是應用比較廣泛的一種模式,在GoF設計模式中也都是屬于創建型的模式,
但是,能夠說明白簡單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官刮目相看,這里有個前提,是你真的能說明白,大部分人,包括在深入研究設計模式之前,我也沒辦法說清楚,不管是我去面試,還是面試其別人,當我面試別人的時候,能講個大概也就差不多了,而我去面試的時候,也就是類似的講個大概,經歷不少挫折之后才有了想深入的研究研究設計模式的想法,于是便會產生這一系列的文章,從這篇簡單工廠開始,我們一起再次深入的對設計模式進行學習,
當然,這里用的是PHP,
解釋
簡單工廠,也稱靜態工廠,不屬于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)模式進行統一的門面管理,

原始碼地址:簡單工廠基礎類圖實作
實體
場景:短信發送功能模塊,現在我們使用了三個商家的,分別是阿里云、蝶信、極光的短信服務,在不同業務中可能使用不同的短信發送商,使用簡單工廠可以方便的完成這個需求,
類圖

代碼
<?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('您有新的短訊息,請查收');
原始碼地址:簡單工廠實體-短信發送工廠
說明
- createMessage一定要使用static?不一定,看自己業務情況決定,需要常駐的全部static,按需實體化的就new完了再正常->去呼叫
- 三個message子類一定需要實作介面?也不一定,php本身就是弱型別語言,可以不去強制實作,但使用介面更加符合面向物件的規范(請參考多型),簡單工廠本身其實是對多型的一種表述和應用
- 當需要增加發送訊息的渠道時,添加新類繼承Message介面,實作send()方法,修改MessageFactory()中createFactory()方法里的switch
- 思考上述修改違背了面向物件的什么原則?(提示:開放XX)
- 實體中沒有使用回傳值型別?本身這也是新語法,對于老版本兼容來說可以不需要去寫,但是如果公司技術堆疊已經升級到7以上的話,建議這種設計模式架構類的代碼還是按照上方解釋中的新特性寫法去書寫,也就是帶上引數型別和回傳值型別,更加的符合規范,也更容易理解
- 實體中傳錯了$type回傳NULL怎么辦?親,實際寫代碼的時候請處理好這個問題喲,回傳一個默認的,或者上層捕獲都是不錯的解決方案,當然最好客戶端那邊提前判斷好,沒問題了再進工廠吧
下期看點
工廠方法模式,接著發短信,但這回我們讓客戶端換個姿勢來發*
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232872.html
標籤:PHP
