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

PHP 設計模式深度解析:工廠模式的核心概念與實戰應用

     編輯:PHP 綜合知識

前言:為什麼需要工廠模式?

在物件導向程式設計中,物件的建立過程往往伴隨著複雜的邏輯判斷。當系統中存在大量相似介面的類別,且需要根據不同條件動態實例化時,直接使用 new 關鍵字會導致程式碼耦合度過高、難以維護。工廠模式正是為了解決這一問題而生——它將物件的建立邏輯封裝在專門的「工廠」類別中,實現「建立者」與「使用者」的解耦。

工廠模式的三大核心要素

根據經典定義,工廠模式包含三個不可或缺的角色:

  • 產品模型(Product Interface):定義產品的公共介面或抽象類別,規範所有具體產品必須實現的方法。
  • 具體產品(Concrete Product):實作產品模型介面的實際類別,代表不同業務邏輯的實體。
  • 工廠車間(Factory):負責根據輸入參數決定建立哪種具體產品,並回傳產品模型介面型別的實例。

範例一:簡單工廠模式(Simple Factory)

簡單工廠模式又稱靜態工廠方法模式,透過一個工廠類別的靜態方法來建立產品。雖然不屬於 GoF 23 種經典設計模式之一,但在實務開發中極為常見。

<?php
// 產品抽象模型
abstract class Model {
    abstract public function getName();
}

// 具體產品:張三
class ZhangSan extends Model {
    public function getName() {
        return "我的名字是張三";
    }
}

// 具體產品:李四
class LiSi extends Model {
    public function getName() {
        return "我的名字是李四";
    }
}

// 工廠類別
class NameFactory {
    public static function create($type) {
        switch ($type) {
            case 'zhangsan':
                return new ZhangSan();
            case 'lisi':
                return new LiSi();
            default:
                throw new InvalidArgumentException("未知的類型: $type");
        }
    }
}

// 客戶端使用
$person = NameFactory::create('zhangsan');
echo $person->getName(); // 輸出:我的名字是張三
?>

優點:邏輯集中、呼叫簡單。
缺點:新增產品時需修改工廠類別,違反「開閉原則」。

範例二:工廠方法模式(Factory Method)

工廠方法模式將建立物件的具體邏輯下放到子類別中,工廠介面只定義建立方法的簽名,由具體工廠決定實例化哪個產品。這樣新增產品時只需新增對應的工廠類別,無需修改既有程式碼。

<?php
// 產品介面
interface Link {
    public function getUrl();
}

// 具體產品
class WebLink implements Link {
    public function getUrl() {
        return "https://www.jb51.net";
    }
}

// 抽象工廠
interface LinkFactory {
    public function createLink(): Link;
}

// 具體工廠
class WebLinkFactory implements LinkFactory {
    public function createLink(): Link {
        return new WebLink();
    }
}

// 使用
$factory = new WebLinkFactory();
$link = $factory->createLink();
echo $link->getUrl(); // 輸出:https://www.jb51.net
?>

範例三:抽象工廠模式(Abstract Factory)

當系統需要建立一組相關或相依的物件,而不需指定它們的具體類別時,抽象工廠模式最為適合。例如:同一廠牌的滑鼠、鍵盤、螢幕必須搭配使用。

<?php
// 產品族介面
interface Mouse { public function click(); }
interface Keyboard { public function type(); }

// 具體產品族 A (Logitech)
class LogitechMouse implements Mouse { public function click() { echo "羅技滑鼠點擊\n"; } }
class LogitechKeyboard implements Keyboard { public function type() { echo "羅技鍵盤輸入\n"; } }

// 具體產品族 B (Razer)
class RazerMouse implements Mouse { public function click() { echo "雷蛇滑鼠點擊\n"; } }
class RazerKeyboard implements Keyboard { public function type() { echo "雷蛇鍵盤輸入\n"; } }

// 抽象工廠
interface ComputerFactory {
    public function createMouse(): Mouse;
    public function createKeyboard(): Keyboard;
}

// 具體工廠
class LogitechFactory implements ComputerFactory {
    public function createMouse(): Mouse { return new LogitechMouse(); }
    public function createKeyboard(): Keyboard { return new LogitechKeyboard(); }
}

class RazerFactory implements ComputerFactory {
    public function createMouse(): Mouse { return new RazerMouse(); }
    public function createKeyboard(): Keyboard { return new RazerKeyboard(); }
}

// 客戶端
function setupWorkstation(ComputerFactory $factory) {
    $mouse = $factory->createMouse();
    $keyboard = $factory->createKeyboard();
    $mouse->click();
    $keyboard->type();
}

setupWorkstation(new LogitechFactory());
// 輸出:
// 羅技滑鼠點擊
// 羅技鍵盤輸入
?>

實務應用建議與常見誤區

  1. 不要過度設計:若系統中產品類別極少且固定,直接 new 即可,無需引入工廠。
  2. 搭配依賴注入容器:現代 PHP 框架(Laravel、Symfony)皆內建服務容器,本質上就是強化版的工廠,優先使用框架提供的機制。
  3. 區分「簡單工廠」與「工廠方法」:前者集中邏輯、違反開閉原則;後者分散邏輯、符合開閉原則。根據專案擴充需求選擇。
  4. 避免在工廠中處理複雜業務邏輯:工廠只負責「建立」,初始化參數、資料庫連線等屬於建構子或 setter 的職責。

總結

工廠模式是物件導向設計中最基礎也最實用的模式之一。掌握其三種變體——簡單工廠、工廠方法、抽象工廠——並理解各自的適用場景,能幫助你撰寫出低耦合、高擴充性、易測試的 PHP 程式碼。記住:模式是為了解決問題而存在的,不是為了用模式而用模式。

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