21xrx.com
2025-03-25 11:21:41 Tuesday
文章检索 我的文章 写文章
PHP常用设计模式和它们的使用场景
2023-06-13 01:31:53 深夜i     10     0

在面试PHP开发职位时,设计模式是一个广受关注的主题。设计模式是在软件开发中经过实践、总结和提炼出来的最佳实践方法,它们能够协助开发者编写可维护、可扩展、易理解的代码。本文将介绍三种常用的设计模式及它们的使用场景。

1. 单例模式

单例模式是一种只允许类创建一个实例的设计模式。通过这种方式,能够保证类的实例在整个应用程序中只有一个,以达到节约资源、避免重复创建以及保证数据一致性等目的。

在PHP中,可以使用以下代码实现单例模式:

class Singleton {
  private static $instance;
  private function __construct() {}
  public static function getInstance() {
    if (null === self::$instance) {
      self::$instance = new self();
    }
    return self::$instance;
  }
}

使用场景:数据库连接、配置文件读取、日志记录等单实例需要的场景。

2. 工厂模式

工厂模式是一种创建型模式,它将对象的创建过程封装起来,使得客户端无需知道具体创建过程,而只需知道所需对象的名称或类型即可。利用工厂模式能够方便地创建大量对象,同时也便于代码的管理和升级。

在PHP中,可以使用以下代码实现简单工厂模式:

interface PaymentMethod {
  public function pay():string;
}
class Alipay implements PaymentMethod {
  public function pay(): string
    return '使用支付宝支付';
  
}
class WechatPay implements PaymentMethod {
  public function pay(): string
    return '使用微信支付';
  
}
class PaymentFactory {
  public function create(string $method): PaymentMethod {
    if ($method == 'alipay') {
      return new Alipay();
    } else {
      return new WechatPay();
    }
  }
}

使用场景:当需要对产品线进行升级时,利用工厂方法可以让所有子工厂共同继承基类工厂,批量进行升级。

3. 观察者模式

观察者模式是一种行为型模式,它定义一种触发机制,当一个可观察对象发生改变时,所有依赖它的对象自动得到通知并进行更新操作。与传统的推、拉式通知不同,观察者模式能够在运行时动态地添加或删除观察者。

在PHP中,可以使用以下代码实现观察者模式:

interface Observer {
  public function update();
}
class Subject {
  private $observers = [];
  public function attach(Observer $observer) {
    $this->observers[] = $observer;
  }
  public function detach(Observer $observer) {
    $key = array_search($observer, $this->observers, true);
    if (false !== $key) {
      unset($this->observers[$key]);
    }
  }
  public function notify() {
    foreach ($this->observers as $observer) {
      $observer->update();
    }
  }
}
class ConcreteObserver implements Observer {
  public function update() {
    echo '观察者被通知了';
  }
}
$subject = new Subject();
$observer = new ConcreteObserver();
$subject->attach($observer);
$subject->notify();

使用场景:多个对象需要对某个对象的变化做出响应,比如在MVC架构中,View层需要响应Model层的变化。其次,在需要做成事件的时候,可以转换成观察者模式。

  
  

评论区