首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 設計模式精講(二):簡單工廠模式與工廠模式深度解析

     編輯:PHP 相關知識

PHP 設計模式精講(二):簡單工廠模式與工廠模式深度解析

接續上篇單例模式,本文深入剖析創建型模式中的兩大經典——簡單工廠模式與工廠模式,通過計算器與交通工具兩個實戰案例,展示其結構差異、優缺點及適用場景。

一、簡單工廠模式

定義與定位

  • 屬於創建型模式,又稱靜態工廠方法模式。
  • 不屬於 GOF 23 種經典設計模式,是工廠模式家族的特殊簡化實現。
  • 核心:一個工廠類根據傳入參數決定創建哪種產品實例。

核心優勢

  1. 封裝實例化邏輯:客戶端無需知道具體類名,只需傳參數(如 '+'、'-'),降低耦合。
  2. 集中維護:新增/修改產品類時,僅調整工廠類 switch 分支,不動用戶端代碼(符合開閉原則的部分精神)。

經典案例:四則運算計算器

<?php
/** 簡單工廠模式——經典運算符例子 */
abstract class Operation {
    protected $numA, $numB;
    public function __construct($a, $b) { $this->numA = $a; $this->numB = $b; }
    abstract public function doing();
    // 靜態工廠方法
    public static function create($operation, $a, $b) {
        switch ($operation) {
            case '+': return new OperationAdd($a, $b);
            case '-': return new OperationMinus($a, $b);
            // case '*': case '/': ... 擴展需修改此處
            default: throw new Exception('不支持的運算符');
        }
    }
}
class OperationAdd extends Operation {
    public function doing() { return $this->numA + $this->numB; }
}
class OperationMinus extends Operation {
    public function doing() { return $this->numA - $this->numB; }
}

// 客戶端調用
$test = Operation::create('+', 2, 56);
echo $test->doing(); // 58
?>

缺點與局限

  • 違反開閉原則 (OCP):新增運算符(如 *、/、%)必須修改工廠類 switch 代碼。
  • 職責過重:所有創建邏輯集中在一個類,隨產品增加變得臃腫。

二、工廠模式

定義與定位

  • GOF 23 種模式之一,又稱多態性工廠。
  • 核心:定義一個創建對象的接口,由子類決定實例化哪個類。
  • 結構包含:抽象產品、具體產品、抽象工廠、具體工廠 四大角色。

經典案例:交通工具工廠

<?php
/** 工廠模式——交通工具例子 */
// 抽象產品
interface Vehicle { public function runing(); }
// 具體產品
class Car implements Vehicle { public function runing() { echo "My speed is 120KM/h\r"; } }
class Bicycle implements Vehicle { public function runing() { echo "My speed is 30KM/h\r"; } }

// 抽象工廠
interface VehicleFactory { public static function get(): Vehicle; }
// 具體工廠
class CarFactory implements VehicleFactory { public static function get(): Vehicle { return new Car(); } }
class BicycleFactory implements VehicleFactory { public static function get(): Vehicle { return new Bicycle(); } }

// 客戶端調用
$vehicle = BicycleFactory::get();
$vehicle->runing(); // My speed is 30KM/h
?>

優缺點對比

維度優點缺點
擴展性完美符合 OCP:新增產品只需新增具體產品類+具體工廠類,無需修改現有代碼類數量成雙增長(每個產品需對應一個工廠),項目結構膨脹
維護性職責清晰:修改某產品創建邏輯只動對應工廠,互不影響簡單場景下過度設計,增加理解成本

實戰優化:簡單工廠 + 工廠模式混合

將相似產品族合併到一個工廠類,例如「陸地交通工具工廠」統管汽車、自行車、摩托車;「水上交通工具工廠」統管輪船、潛艇。兼顧擴展性與類數量控制。


總結與選型建議

  • 簡單工廠:產品種類固定、變化極少、邏輯簡單(如運算符、日誌驅動選擇)。
  • 工廠模式:產品族清晰、頻繁新增產品、團隊協作需嚴格解耦(如支付渠道、消息推送通道、文件存儲驅動)。
  • 進階:當產品族需跨平台/多維度變化時,考慮抽象工廠模式(下篇講解)。

設計模式無優劣,只有適不適合。理解其解決什麼問題、付出什麼代價,才是架構師的核心修養。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved