首頁  >  文章  >  後端開發  >  PHP 設計模式實戰詳解

PHP 設計模式實戰詳解

PHPz
PHPz原創
2024-05-07 13:57:01477瀏覽

設計模式為軟體設計提供經過驗證的解決方案,解決常見程式設計問題。本文深入探討 PHP 中常用的設計模式,並透過實戰案例進行闡述,涵蓋單例模式、工廠方法模式和觀察者模式。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn