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

PHP 設計模式:建造者模式完整實作與複雜物件組裝解耦

     編輯:PHP 相關知識

PHP 設計模式系列三:建造者模式深度解析與購物車組裝實戰

建造者模式將複雜物件的建構過程與其表示分離,使相同建構過程可建立不同表示。適用於建構步驟固定但內部結構複雜的物件。本文以購物車還原為例完整實作。

模式結構角色

  • Product(產品):複雜物件(如 ShoppingCart)
  • Builder(抽象建造者):定義建構步驟介面
  • ConcreteBuilder(具體建造者):實作建構步驟,追蹤建構進度
  • Director(指導者):控制建構順序(可選,客戶端也可直接呼叫)

完整程式碼實作

<?php
// 產品:購物車
class ShoppingCart {
    private $goods = [];
    private $tickets = [];
    
    public function addGoods($goods) { $this->goods[] = $goods; }
    public function addTicket($ticket) { $this->tickets[] = $ticket; }
    
    public function printInfo() {
        printf("商品:%s, 優惠券:%s\n", implode(',', $this->goods), implode(',', $this->tickets));
    }
}

// 建造者介面
interface CartBuilderInterface {
    public function buildGoods(array $goods);
    public function buildTickets(array $tickets);
    public function getCart(): ShoppingCart;
}

// 具體建造者
class CartBuilder implements CartBuilderInterface {
    private $cart;
    
    public function __construct(ShoppingCart $cart) {
        $this->cart = $cart;
    }
    
    public function buildGoods(array $goods) {
        foreach ($goods as $item) {
            $this->cart->addGoods($item);
        }
    }
    
    public function buildTickets(array $tickets) {
        foreach ($tickets as $ticket) {
            $this->cart->addTicket($ticket);
        }
    }
    
    public function getCart(): ShoppingCart {
        return $this->cart;
    }
}

// 指導者(可選,封裝建構順序)
class CartDirector {
    public function buildFromSession(CartBuilderInterface $builder, array $sessionData) {
        if (isset($sessionData['goods'])) {
            $builder->buildGoods($sessionData['goods']);
        }
        if (isset($sessionData['tickets'])) {
            $builder->buildTickets($sessionData['tickets']);
        }
    }
}

// 客戶端使用
$sessionData = [
    'goods'   => ['衣服', '鞋子'],
    'tickets' => ['折扣10元'],
];

// 不使用建造者:業務邏輯分散在客戶端
// $cart = new ShoppingCart();
// foreach ($sessionData['goods'] as $g) $cart->addGoods($g);
// foreach ($sessionData['tickets'] as $t) $cart->addTicket($t);

// 使用建造者:封裝組裝邏輯
$cart = new ShoppingCart();
$builder = new CartBuilder($cart);
$director = new CartDirector();
$director->buildFromSession($builder, $sessionData);

echo "建構完成:\n";
$cart->printInfo();

建造者模式 vs 工廠模式

實戰應用場景

  1. HTTP 請求物件建構:Headers、Body、Query Params 分步驟設定
  2. 報表產生器:資料來源、格式、篩選條件、輸出格式
  3. 資料庫查詢建構器:SELECT、WHERE、JOIN、ORDER、LIMIT 鏈式呼叫
  4. 複雜表單驗證規則建構:欄位、規則、訊息、條件分組

現代 PHP 的流式介面

PHP 可直接在產品類別實作鏈式方法,簡化建造者:

<?php
class QueryBuilder {
    private $select = '*';
    private $where = [];
    private $order = '';
    private $limit = 0;
    
    public function select($fields) { $this->select = $fields; return $this; }
    public function where($col, $op, $val) { $this->where[] = [$col, $op, $val]; return $this; }
    public function orderBy($col, $dir = 'ASC') { $this->order = "$col $dir"; return $this; }
    public function limit($n) { $this->limit = $n; return $this; }
    
    public function getSQL() {
        $sql = "SELECT $this->select FROM table";
        if ($this->where) $sql .= " WHERE " . $this->buildWhere();
        if ($this->order) $sql .= " ORDER BY $this->order";
        if ($this->limit) $sql .= " LIMIT $this->limit";
        return $sql;
    }
}

// 使用:流式介面即建造者
$sql = (new QueryBuilder())
    ->select('id, name')
    ->where('status', '=', 1)
    ->orderBy('created_at', 'DESC')
    ->limit(10)
    ->getSQL();

此模式在 Laravel Eloquent、Doctrine QueryBuilder 等知名庫廣泛使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性工廠模式建造者模式
關注點建立「什麼」物件「如何」一步步建構物件
建構過程單步驟完成多步驟、可控制順序
產品複雜度較簡單複雜、多組件組合
回傳時機立即回傳建構完成後回傳