先從簡單工廠入門,不論是面試仍是被他人面試,在問到設計模式的時候,大多數人都會提到工廠模式。毫無疑問,工廠相關的幾種模式在設計模式中是最出名的也是應用比較普遍的一種模式。在GoF設計模式中也都是屬於建立型的模式。php
可是,可以說明白簡單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官另眼相看。這裏有個前提,是你真的能說明白,大部分人,包括在深刻研究設計模式以前,我也沒辦法說清楚。不論是我去面試,仍是面試其別人。當我面試別人的時候,能講個大概也就差很少了。而我去面試的時候,也就是相似的講個大概。經歷很多挫折以後纔有了想深刻的研究研究設計模式的想法,因而便會產生這一系列的文章。從這篇簡單工廠開始,咱們一塊兒再次深刻的對設計模式進行學習。git
簡單工廠,也稱靜態工廠,不屬於GoF23種設計模式。可是能夠說是全部的設計模式中你們可能最容易理解,也可能在你的代碼中早就已經用過不知道多少次的一種設計模式了。咱們先從一個最最簡單的代碼段來看。github
// 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變量)指明型號,而後富士康就給我對應型號的手機,而後我就繼續個人工做了,和富士康的合做還真是挺愉快的。spa
這裏比較規範的寫法多是全部產品都會去實現一個統一的接口,而後客戶端只知道接口的方法統一調用便可。不規範的話也能夠不使用接口,返回各類不一樣的對象,相似於外觀(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('您有新的短消息,請查收');
複製代碼
源碼地址:簡單工廠實例-短信發送工廠
說明
工廠方法模式,接着發短信,但這回咱們讓客戶端換個姿式來發