21xrx.com
2024-11-25 16:49:10 Monday
登录
文章检索 我的文章 写文章
PHP常用设计模式和它们的使用场景
2023-06-13 01:31:53 深夜i     --     --

在面试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层的变化。其次,在需要做成事件的时候,可以转换成观察者模式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复