萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 建造者模式完整實作教學與範例解析

建造者模式簡介

建造者模式屬於創建型設計模式,主要用於「分步驟建構複雜物件」。當一個物件的內部結構複雜、屬性之間有相依關係、或是建構過程需要用到其他難以直接取得的系統物件時,這個模式非常適合。它將物件的建構過程與其表示分離,使得相同的建構過程可以建立不同的表示。

適用場景

  • 產品物件擁有複雜的內部結構(如汽車包含引擎、車身、輪胎等組件)。
  • 產品屬性相互依賴,必須按照特定順序建構(例如先裝引擎再裝車身)。
  • 建構過程中需要用到系統中其他不易直接獲取的物件。

模式優勢

  • 封裝性佳:客戶端不需知道產品內部組成細節。
  • 擴充性強:每個具體建造者相互獨立,互不影響。
  • 控制精細:指揮者類可精確控制建構流程與順序。

核心角色

  1. Product(產品角色):最終要建構的複雜物件(範例中的 Car 類)。
  2. Builder(抽象建造者):定義建構步驟的介面(抽象類 CarBuilder)。
  3. ConcreteBuilder(具體建造者):實作具體建構邏輯(BMW、BuickBird)。
  4. Director(指揮者):協調建造者按順序執行建構步驟,返回最終產品。

PHP 完整程式碼範例

<?php
/** 產品類:車 */
class Car {
    public $_head;   // 車頭顏色
    public $_engine; // 引擎品牌
    public $_tyre;   // 輪胎品牌

    public function show() {
        echo "車頭的顏色:{$this->_head}<br/>";
        echo "引擎的品牌:{$this->_engine}<br/>";
        echo "輪胎的品牌:{$this->_tyre}<br/>";
    }
}

/** 抽象建造者 */
abstract class CarBuilder {
    protected $_car;

    public function __construct() {
        $this->_car = new Car();
    }

    abstract public function BuildHead();
    abstract public function BuildEngine();
    abstract public function BuildTyre();
    abstract public function GetCar();
}

/** 具體建造者:寶馬 */
class BMW extends CarBuilder {
    public function BuildHead() { $this->_car->_head = "Black"; }
    public function BuildEngine() { $this->_car->_engine = "BMW"; }
    public function BuildTyre() { $this->_car->_tyre = "BMW"; }
    public function GetCar() { return $this->_car; }
}

/** 具體建造者:別克 */
class BuickBird extends CarBuilder {
    public function BuildHead() { $this->_car->_head = "Red"; }
    public function BuildEngine() { $this->_car->_engine = "Buick"; }
    public function BuildTyre() { $this->_car->_tyre = "Buick"; }
    public function GetCar() { return $this->_car; }
}

/** 指揮者:控制建構流程 */
class Director {
    public function Construct(CarBuilder $builder) {
        $builder->BuildHead();
        $builder->BuildEngine();
        $builder->BuildTyre();
        return $builder->GetCar();
    }
}

// 客戶端使用範例
$director = new Director();

$bmwBuilder = new BMW();
$bmwCar = $director->Construct($bmwBuilder);
$bmwCar->show();

$buickBuilder = new BuickBird();
$buickCar = $director->Construct($buickBuilder);
$buickCar->show();
?>

執行結果

車頭的顏色:Black
引擎的品牌:BMW
輪胎的品牌:BMW
車頭的顏色:Red
引擎的品牌:Buick
輪胎的品牌:Buick

總結

建造者模式將複雜物件的建構細節封裝在具體建造者中,透過指揮者統一協調流程,符合「單一職責原則」與「開放封閉原則」。若未來要新增「賓士」車型,只需新增一個 Benz extends CarBuilder 即可,完全不需修改既有程式碼,極大提升系統的可維護性與擴充性。

copyright © 萬盛學電腦網 all rights reserved