建造者模式屬於創建型設計模式,主要用於「分步驟建構複雜物件」。當一個物件的內部結構複雜、屬性之間有相依關係、或是建構過程需要用到其他難以直接取得的系統物件時,這個模式非常適合。它將物件的建構過程與其表示分離,使得相同的建構過程可以建立不同的表示。
<?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 即可,完全不需修改既有程式碼,極大提升系統的可維護性與擴充性。