確保類僅有一個實例,並提供全局訪問點。適用於資料庫連接、配置管理、日誌記錄等場景。
<?php
class Database {
private static $instance = null;
private function __construct() { /* 連接初始化 */ }
public static function getInstance() {
if (self::$instance === null) self::$instance = new self();
return self::$instance;
}
// 禁止克隆與反序列化
private function __clone() {}
private function __wakeup() {}
}
$db = Database::getInstance();
?>
定義創建對象的接口,由子類決定實例化哪個類。消除客戶端對具體類的依賴。
<?php
interface Logger { public function log($msg); }
class FileLogger implements Logger { public function log($msg) { /* 寫文件 */ } }
class DbLogger implements Logger { public function log($msg) { /* 寫庫 */ } }
class LoggerFactory {
public static function create($type) {
switch ($type) {
case 'file': return new FileLogger();
case 'db': return new DbLogger();
default: throw new Exception('Unknown logger');
}
}
}
$logger = LoggerFactory::create('file');
$logger->log('test');
?>
定義一系列算法,封裝每個算法,使它們可互換。讓算法獨立於使用它的客戶端而變化。
<?php
interface PayStrategy { public function pay($amount); }
class Alipay implements PayStrategy { public function pay($amount) { /* 支付寶 */ } }
class WechatPay implements PayStrategy { public function pay($amount) { /* 微信 */ } }
class OrderContext {
private $strategy;
public function setStrategy(PayStrategy $s) { $this->strategy = $s; }
public function checkout($amount) { $this->strategy->pay($amount); }
}
$order = new OrderContext();
$order->setStrategy(new Alipay());
$order->checkout(100);
?>
定義對象間一對多依賴,當一個對象狀態改變,所有依賴者自動收到通知並更新。適用於事件系統、異步通知。
<?php
interface Observer { public function update($event); }
class Subject {
private $observers = [];
public function attach(Observer $o) { $this->observers[] = $o; }
public function notify($event) { foreach ($this->observers as $o) $o->update($event); }
}
class EmailNotifier implements Observer { public function update($e) { /* 發郵件 */ } }
class SmsNotifier implements Observer { public function update($e) { /* 發短信 */ } }
$sub = new Subject();
$sub->attach(new EmailNotifier());
$sub->attach(new SmsNotifier());
$sub->notify('user_registered');
?>
將依賴關系從類內部移至外部容器注入,實現控制反轉(IoC),降低耦合,便於測試與替換。
<?php
interface DbAdapter { public function query($sql); }
class MysqlAdapter implements DbAdapter { /* 實現 */ }
class UserService {
private $db;
public function __construct(DbAdapter $db) { $this->db = $db; } // 構造器注入
public function getUser($id) { return $this->db->query("SELECT * FROM users WHERE id=$id"); }
}
$service = new UserService(new MysqlAdapter());
?>
這五大模式覆蓋了創建型、行為型、結構型核心需求,合理應用能顯著提升代碼可維護性、擴展性與測試性。