接續上篇單例模式,本文深入剖析創建型模式中的兩大經典——簡單工廠模式與工廠模式,通過計算器與交通工具兩個實戰案例,展示其結構差異、優缺點及適用場景。
'+'、'-'),降低耦合。switch 分支,不動用戶端代碼(符合開閉原則的部分精神)。<?php
/** 簡單工廠模式——經典運算符例子 */
abstract class Operation {
protected $numA, $numB;
public function __construct($a, $b) { $this->numA = $a; $this->numB = $b; }
abstract public function doing();
// 靜態工廠方法
public static function create($operation, $a, $b) {
switch ($operation) {
case '+': return new OperationAdd($a, $b);
case '-': return new OperationMinus($a, $b);
// case '*': case '/': ... 擴展需修改此處
default: throw new Exception('不支持的運算符');
}
}
}
class OperationAdd extends Operation {
public function doing() { return $this->numA + $this->numB; }
}
class OperationMinus extends Operation {
public function doing() { return $this->numA - $this->numB; }
}
// 客戶端調用
$test = Operation::create('+', 2, 56);
echo $test->doing(); // 58
?>
*、/、%)必須修改工廠類 switch 代碼。<?php
/** 工廠模式——交通工具例子 */
// 抽象產品
interface Vehicle { public function runing(); }
// 具體產品
class Car implements Vehicle { public function runing() { echo "My speed is 120KM/h\r"; } }
class Bicycle implements Vehicle { public function runing() { echo "My speed is 30KM/h\r"; } }
// 抽象工廠
interface VehicleFactory { public static function get(): Vehicle; }
// 具體工廠
class CarFactory implements VehicleFactory { public static function get(): Vehicle { return new Car(); } }
class BicycleFactory implements VehicleFactory { public static function get(): Vehicle { return new Bicycle(); } }
// 客戶端調用
$vehicle = BicycleFactory::get();
$vehicle->runing(); // My speed is 30KM/h
?>
| 維度 | 優點 | 缺點 |
|---|---|---|
| 擴展性 | 完美符合 OCP:新增產品只需新增具體產品類+具體工廠類,無需修改現有代碼 | 類數量成雙增長(每個產品需對應一個工廠),項目結構膨脹 |
| 維護性 | 職責清晰:修改某產品創建邏輯只動對應工廠,互不影響 | 簡單場景下過度設計,增加理解成本 |
將相似產品族合併到一個工廠類,例如「陸地交通工具工廠」統管汽車、自行車、摩托車;「水上交通工具工廠」統管輪船、潛艇。兼顧擴展性與類數量控制。
設計模式無優劣,只有適不適合。理解其解決什麼問題、付出什麼代價,才是架構師的核心修養。