PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

在PHP开发中,设计模式是一种很常见的编程思想。设计模式是对软件开发中经常出现的问题得出的通用解决方案。下面我将详细讲解PHP中三种常用的设计模式:单例模式、工厂模式、观察者模式。

单例模式

单例模式是一种创建型模式,它的目的是保证一个类只有一个实例,而且提供了一个全局访问该实例的方法。
下面是PHP单例模式的代码示例:

class Singleton
{
    private static $instance;

    private function __construct()
    {
        //构造函数私有化,避免外部创建实例
    }

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __clone()
    {
        //禁止克隆
    }

    private function __wakeup()
    {
        //禁止反序列化
    }
}

$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
var_dump($singleton1 === $singleton2); // true

在上面的示例代码中,使用了一个私有静态变量保存了该类的实例,然后提供了一个静态方法 getInstance() 来获取该实例。在 getInstance() 方法中先判断实例是否存在,如果不存在就创建该实例。同时将构造函数声明为私有,禁止外部创建这个类的实例,避免创建多个实例。

工厂模式

工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。工厂模式使用工厂方法来解决生成对象的问题,它通过工厂类来创建对象,而不需要直接调用类的构造函数。
下面是PHP工厂模式的代码示例:

interface Product
{
    public function getName();
}

class ProductA implements Product
{
    public function getName()
    {
        return "ProductA";
    }
}

class ProductB implements Product
{
    public function getName()
    {
        return "ProductB";
    }
}

class ProductFactory
{
    public function createProduct($type)
    {
        switch ($type) {
            case 'A':
                return new ProductA();
            case 'B':
                return new ProductB();
            default:
                throw new Exception("Invalid product type.");
        }
    }
}

$productFactory = new ProductFactory();
$productA = $productFactory->createProduct('A');
$productB = $productFactory->createProduct('B');

echo $productA->getName() . PHP_EOL; // ProductA
echo $productB->getName() . PHP_EOL; // ProductB

在上面的示例代码中,我们创建了一个 Product 接口,其中声明了 getName() 方法,然后分别创建了两个 Product 的实现类,ProductAProductB 实现了 Product 接口,并分别实现了 getName() 方法。最后创建了一个 ProductFactory 工厂类,它具有 createProduct() 方法,这个方法通过传递参数来创建不同类型的产品。如果传递的参数不在工厂类支持的产品类型中,则抛出一个异常。

观察者模式

观察者模式是一种行为型模式,当对象状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
下面是PHP观察者模式的代码示例:

interface Observer
{
    public function update($data);
}

class ConcreteObserver1 implements Observer
{
    public function update($data)
    {
        echo "ConcreteObserver1 has received data: " . $data . PHP_EOL;
    }
}

class ConcreteObserver2 implements Observer
{
    public function update($data)
    {
        echo "ConcreteObserver2 has received data: " . $data . PHP_EOL;
    }
}

interface Subject
{
    public function addObserver(Observer $observer);

    public function removeObserver(Observer $observer);

    public function notifyObservers($data);
}

class ConcreteSubject implements Subject
{
    private $observers = array();

    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    public function removeObserver(Observer $observer)
    {
        foreach ($this->observers as $key => $val) {
            if ($val === $observer) {
                unset($this->observers[$key]);
            }
        }
    }

    public function notifyObservers($data)
    {
        foreach ($this->observers as $observer) {
            $observer->update($data);
        }
    }
}

$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();
$subject->addObserver($observer1);
$subject->addObserver($observer2);

$subject->notifyObservers('Hello world!');

$subject->removeObserver($observer1);

$subject->notifyObservers('Hello world again!');

在上面的示例代码中,我们创建了一个 Observer 接口,其中定义了 update() 方法,然后创建了两个具体的观察者 ConcreteObserver1ConcreteObserver2,它们实现了 Observer 接口,并分别实现了 update() 方法。接下来创建了一个 Subject 接口,定义了 addObserver()removeObserver()notifyObservers() 方法。然后创建了一个具体的主题 ConcreteSubject,实现了 Subject 接口,并实现了其中的方法。最后创建了一个观察者案例,先将两个观察者添加到主题中,然后调用 notifyObservers() 方法通知所有观察者,当主题状态改变时,观察者可以收到通知。最后再移除一个观察者并再次调用 notifyObservers() 方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 微信小程序名称可以修改几次? 微信小程序修改名称的方法

    下面是关于微信小程序名称修改的完整攻略,包括修改次数和方法介绍。 微信小程序名称可以修改几次? 微信小程序的名称可以修改不限次数,但是每次修改都需要重新提交审核,审核通过后才能使用。 微信小程序修改名称的方法 微信小程序修改名称的方法比较简单,只需要进入小程序管理后台即可。下面介绍具体步骤: 登录小程序管理后台,选择“开发”-“开发设置”-“基本设置” 在“…

    PHP 2023年5月23日
    00
  • PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)

    下面详细讲解“PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)”的完整攻略。 1. 题目背景 在网站数据库操作中,可能会存在多列具有相同值的重复数据,我们需要通过PHP语言来实现查询并删除这些数据库中的重复数据,以保证网站数据库的数据质量。 2. 实现过程 具体实现过程如下: 2.1 连接数据库 在PHP代码中先连接到数据库,这里以MySQL为例…

    PHP 2023年5月26日
    00
  • 8个PHP程序员常用的功能汇总

    8个PHP程序员常用的功能汇总 本篇文章将介绍8个PHP程序员常用的功能,包括字符串处理、数组操作、文件操作等常见操作,以及相应的示例说明。 1. 字符串替换 字符串替换是PHP中常用的功能之一,使用str_replace函数可以实现指定字符串在目标字符串中的替换。 示例: $str = "PHP is a popular programming …

    PHP 2023年5月30日
    00
  • php 数组元素快速去重

    以下是 PHP 数组元素快速去重的攻略: 使用 array_unique() 函数进行数组去重 在 PHP 中,我们可以使用 array_unique() 函数快速地去重一个数组。该函数会返回一个新的数组,其中不会包含重复的元素。 以下是该函数的语法: array_unique(array $array [, int $sort_flags = SORT_S…

    PHP 2023年5月26日
    00
  • 高性能PHP框架Symfony2经典入门教程

    高性能PHP框架Symfony2经典入门教程完整攻略 Symfony2是一个面向对象的PHP框架,其出色的性能和强大的功能能够帮助开发者快速构建高质量的Web应用。本教程将带领你从入门到进阶,全面了解Symfony2的架构、编程模型和各种常用功能。 基础篇 1. 安装Symfony2 首先,需要在你的机器上安装PHP。可以通过官网下载最新版PHP:https…

    PHP 2023年5月23日
    00
  • php数组添加元素方法小结

    下面我将详细讲解如何使用PHP数组添加元素的方法。 1. 使用array_push()函数 使用array_push()函数可以将一个或多个元素添加到数组末尾。该函数接收两个参数,第一个参数是要添加元素的数组,第二个参数可以是一个单独的值,也可以是一个包含多个值的数组。 下面是一个示例: $fruits = array("apple", …

    PHP 2023年5月26日
    00
  • 深入php多态的实现详解

    那么我来详细讲解“深入PHP多态的实现详解”的完整攻略。 什么是多态 多态是面向对象编程的三大特性之一,指的是同一操作作用在不同的对象上面时,会产生不同的行为。通过多态,我们可以写出通用的代码,使得同一个函数或方法能够处理不同种类的对象,从而提高代码的复用性和灵活性。 PHP中的多态实现 在PHP中,多态可以通过继承和接口来实现。下面我们分别来看一下。 继承…

    PHP 2023年5月27日
    00
  • PHP 获取远程网页内容的代码(fopen,curl已测)

    针对“PHP 获取远程网页内容的代码(fopen,curl已测)”这个话题,以下是详细的攻略: 使用 fopen 函数获取远程网页内容 要使用 fopen 函数获取远程网页内容,需要对服务器的 php.ini 文件做相应的配置:将 allow_url_fopen 选项设置为 On。如果服务器没有设置,可以使用以下代码手动设置: ini_set(‘allow_…

    PHP 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部