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

PHP 設計模式實戰:單例模式與簡單工廠模式完整解析

     編輯:PHP 相關知識

設計模式價值

設計模式是軟體工程的「結構圖紙」,提供可重用、可讀、可靠的代碼組織方式。PHP 物件導向開發中,掌握核心模式能大幅提升架構品質。

單例模式

適用場景

  • 資料庫連線管理
  • 配置管理器
  • 日誌記錄器
  • 快取管理器

標準實作

<?php
class Singleton {
    // 1. 靜態實例容器
    private static $_instance = null;

    // 2. 私有建構子,防止外部 new
    private function __construct() {
        // 初始化資源 (DB 連線、讀取配置等)
    }

    // 3. 私有克隆,防止 clone
    private function __clone() {}

    // 4. 私有反序列化,防止 unserialize
    private function __wakeup() {}

    // 5. 公共靜態取得實例方法
    public static function getInstance() {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    // 業務方法
    public function sayHi() {
        echo "Hi boy!";
    }
}

// 使用方式
$app = Singleton::getInstance();
$app->sayHi(); // Hi boy!

// 多次呼叫回傳同一實例
$app2 = Singleton::getInstance();
var_dump($app === $app2); // true

關鍵要素檢核表

要素實作目的
私有建構子`private function __construct()`防止 `new Singleton()`
靜態實例變數`private static $_instance`保存唯一實例
公共靜態取得方法`public static function getInstance()`全域存取點
私有 `__clone``private function __clone() {}`防止 `clone $obj`
私有 `__wakeup``private function __wakeup() {}`防止 `unserialize()` 產生新實例

簡單工廠模式

解決問題

當有大量實作同一介面的類別,業務邏輯中散落 `new ClassA()`、`new ClassB()`,導致耦合度高、難以維護、擴充新類別需修改多處代碼。

實作範例

<?php
// 1. 定義介面
interface ProductInterface {
    public function showProductInfo();
}

// 2. 具體產品實作
class ProductA implements ProductInterface {
    public function showProductInfo() { echo 'This is product A.'; }
}

class ProductB implements ProductInterface {
    public function showProductInfo() { echo 'This is product B.'; }
}

// 3. 工廠類別
class ProductFactory {
    public static function factory($type) {
        $className = 'Product' . strtoupper($type);
        if (class_exists($className)) {
            return new $className();
        }
        throw new Exception("Product type '$type' not found.");
    }
}

// 4. 客戶端使用
$x = ProductFactory::factory('A');
$x->showProductInfo(); // This is product A.

$o = ProductFactory::factory('B');
$o->showProductInfo(); // This is product B.

工廠模式優勢

  • 解耦:客戶端只依賴介面 `ProductInterface`,不依賴具體類別。
  • 集中管理:物件建立邏輯集中在 `ProductFactory`,新增產品只修改工廠。
  • 可配置化:結合配置檔 (`$config['default_product'] = 'A'`) 實現無代碼切換。
  • 參數化建立:`factory($type, $params)` 可傳遞建構參數。

進階:工廠方法 vs 抽象工廠

模式特徵適用
簡單工廠單一類別靜態方法建立所有產品產品種類少、建立邏輯簡單
工廠方法抽象工廠類別 + 多個具體工廠子類別每個產品建立邏輯複雜、需擴充
抽象工廠建立相關/相依物件家族的介面多個產品族 (如不同 DB 驅動全套)

實務建議

  1. **單例謹慎使用**:全域狀態難測試、難平行化,優先考慮依賴注入 (DI) 容器管理生命週期。
  2. **工廠配合介面**:永遠面向介面程式設計,具體類別隱藏在工廠內部。
  3. **自動載入友善**:工廠中 `class_exists()` 需配合 PSR-4 自動載入,避免手動 `require`。
  4. **測試友善**:單例可加入 `resetInstance()` 供單元測試重置;工廠可注入 Mock 物件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved