設計模式為軟體設計提供經過驗證的解決方案,解決常見程式設計問題。本文深入探討 PHP 中常用的設計模式,並透過實戰案例進行闡述,涵蓋單例模式、工廠方法模式和觀察者模式。
PHP 設計模式實戰詳解
設計模式為軟體設計提供了一套經過驗證的解決方案,以解決常見程式設計問題。本文將深入探討 PHP 中常用的設計模式,並透過實戰案例來闡述。
單例模式
單例模式確保某個類別只被實例化一次。這對於全域資源或配置管理器很有用。
class Database { private static ?\PDO $instance = null; private function __construct() {} public static function getInstance(): \PDO { if (self::$instance === null) { self::$instance = new \PDO('mysql:host=localhost;dbname=my_db', 'user', 'password'); } return self::$instance; } } // 使用 Singleton $db1 = Database::getInstance(); $db2 = Database::getInstance(); // 两个变量指向同一个 PDO 对象 var_dump($db1 === $db2); // true
工廠方法模式
工廠方法模式定義一個建立物件的接口,但允許子類別變更建立過程。這提供了一種分離創建邏輯和產品類別的靈活方式。
interface Shape { public function draw(): void; } class Circle implements Shape { public function draw(): void { echo 'Drawing a circle.' . PHP_EOL; } } class Square implements Shape { public function draw(): void { echo 'Drawing a square.' . PHP_EOL; } } class ShapeFactory { public static function createShape(string $type): Shape { switch ($type) { case 'circle': return new Circle(); case 'square': return new Square(); default: throw new InvalidArgumentException('Invalid shape type.'); } } } // 使用工厂方法 $circle = ShapeFactory::createShape('circle'); $square = ShapeFactory::createShape('square'); $circle->draw(); // Drawing a circle. $square->draw(); // Drawing a square.
觀察者模式
觀察者模式定義了一個一對多的依賴關係,其中一個物件(主題)可以通知多個物件(觀察者)狀態變化。
interface Subject { public function attach(Observer $observer): void; public function detach(Observer $observer): void; public function notify(): void; } class NewsPortal implements Subject { private array $observers = []; private string $latestNews; public function attach(Observer $observer): void { $this->observers[] = $observer; } public function detach(Observer $observer): void { unset($this->observers[array_search($observer, $this->observers)]); } public function notify(): void { foreach ($this->observers as $observer) { $observer->update($this); } } public function publishNews(string $news): void { $this->latestNews = $news; $this->notify(); } } interface Observer { public function update(Subject $subject): void; } class NewsReader implements Observer { public function update(Subject $subject): void { $news = $subject->getLatestNews(); echo 'Received latest news: ' . $news . PHP_EOL; } } // 使用观察者模式 $newsPortal = new NewsPortal(); $reader1 = new NewsReader(); $reader2 = new NewsReader(); $newsPortal->attach($reader1); $newsPortal->attach($reader2); $newsPortal->publishNews('New developments in the ongoing war.'); $newsPortal->detach($reader2); $newsPortal->publishNews('Another major breakthrough in science.');
以上是PHP 設計模式實戰詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!