工廠模式是一種建立型設計模式,核心思想是:將物件的建立邏輯封裝在專門的「工廠類」中,呼叫端只需告知「要什麼」,無需關心「怎麼建立」。這就像你去餐廳點餐,只需告知服務生「我要一份牛排」,廚房如何烹飪、盤飾你完全不用操心。
專案後期若原本的類別需新增建構參數,若到處都是 new ClassName(),修改成本極高。工廠模式將建立邏輯集中,僅需調整工廠方法即可。
PHP 連接 MySQL 有 mysqli、PDO、mysql(已棄用)等多種方式。若業務代碼直接耦合具體實作,切換驅動將極其痛苦。工廠模式配合介面,可實現「面向介面編程,而非面向實作」。
單一工廠類,靜態方法根據參數決定建立哪個產品。不屬於 GoF 23 種模式,但實務最常用。
<?php
interface Transport {
public function go();
}
class Bus implements Transport {
public function go() { echo "公車每站都停\n"; }
}
class Car implements Transport {
public function go() { echo "轎車飛馳\n"; }
}
class Bike implements Transport {
public function go() { echo "腳踏車慢悠悠\n"; }
}
class TransportFactory {
public static function create($type) {
switch ($type) {
case 'bus': return new Bus();
case 'car': return new Car();
case 'bike': return new Bike();
default: throw new InvalidArgumentException("未知交通工具: $type");
}
}
}
// 使用
$vehicle = TransportFactory::create('car');
$vehicle->go(); // 輸出:轎車飛馳
定義一個建立物件的介面,由子類別決定實例化哪個類別。適用於「一個工廠對應一種產品」的擴展場景。
提供一個介面,用於建立「相關或依賴物件的家族」,而無需指定具體類別。適用於多維度變化(如:不同資料庫 × 不同快取驅動)。
若工廠方法命名為 factory(),**千萬別將工廠類命名為 Factory**!因為 PHP 若類別與方法同名,舊版本會將其視為建構子(雖 PHP 7+ 已移除此特性,但為相容性與語義清晰,仍建議避免)。
許多新手急於用模式卻忽略基礎。筆者建議:先把 if/else、Session、資料庫操作寫熟,再思考如何重構為模式。真正的「恍然大悟」往往發生在你親手重構、踩坑、優化之後,而非背誦定義時。
工廠模式是通往「高內聚、低耦合」的關鍵橋樑。下一篇將介紹註冊樹模式,將單例與工廠產出的物件統一管理,敬請期待。
系列文章: