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数字前补0的自带函数sprintf 和number_format的用法(详解)

    PHP数字前补0的自带函数sprintf和number_format的用法(详解) 在PHP中处理数字时,有时需要将数字转换成带有前导零的字符串,以满足特定的格式要求。这时我们可以使用内置函数sprintf和number_format进行处理。本文将详细讲解这两种函数的用法。 1. sprintf函数 sprintf函数可以将格式化的字符串输出到某个变量中。…

    PHP 2023年5月26日
    00
  • PHP针对字符串开头和结尾的判断方法

    下面是PHP针对字符串开头和结尾的判断方法的完整攻略。 判断字符串开头是否为某个字符串 在PHP中,可以使用字符串函数strpos()来判断一个字符串的开头是否为另一个字符串。该函数用于在一个字符串中查找另一个字符串第一次出现的位置,如果该位置为0,则表示该字符串开头与之匹配。以下是使用该函数实现的示例代码: $str = ‘Hello World!’; $…

    PHP 2023年5月26日
    00
  • PHP数组与对象之间使用递归实现转换的方法

    下面是详细讲解“PHP数组与对象之间使用递归实现转换的方法”的完整攻略。 什么是递归 递归是一种编程技巧,常用于解决一些循环操作复杂的问题。在编写递归算法时,需要把问题分解为简单的子问题,然后逐步地求解这些子问题,最终得到原问题的解。 什么是PHP数组 PHP数组是一个能够存储多个值的数据结构,通常用于存储一组相关的数据。在PHP中,数组可以使用下标或者关联…

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的适配器模式

    简介: 适配器模式属于结构型设计模式。将一个类的接口转换成可应用的兼容接口。适配器使原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种实现方案,一种是继承的方式,一种是组合的方式。 适用场景: 兼容不方便更改的“祖传”代码。 归纳具有相似点的模块,比如Laravel FileSystemAdapter。 优点: 扩展了原有类,增强了扩展性…

    PHP 2023年4月18日
    00
  • php专用数组排序类ArraySortUtil用法实例

    下面我将详细讲解“php专用数组排序类ArraySortUtil用法实例”的完整攻略: 什么是php专用数组排序类ArraySortUtil php专用数组排序类ArraySortUtil 是一个专门用于 PHP 数组排序的工具类,它提供了多种排序算法和排序方式,可以快速、方便地对数组进行排序和筛选。 如何安装php专用数组排序类ArraySortUtil …

    PHP 2023年5月26日
    00
  • php中preg_replace_callback函数简单用法示例

    让我来详细讲解一下 “php中preg_replace_callback函数简单用法示例” 的完整攻略。 preg_replace_callback函数简介 PHP中preg_replace_callback()函数是正则表达式中的一个强大工具。它是preg_replace()函数的一种变体,用于在匹配的字符串中执行一个回调函数来进行替换。 该函数常用于处理…

    PHP 2023年5月26日
    00
  • PHP编码转换函数 自动转换字符集支持数组转换

    来讲解一下PHP编码转换函数自动转换字符集支持数组转换的完整攻略。 什么是PHP编码转换函数 在PHP中,编码转换函数能够实现不同字符集之间的转换。这些函数可以将字符串从一种字符集转换为另一种字符集。PHP编码转换函数有很多种,比如iconv()、mb_convert_encoding()、iconv_strlen()等常用的函数。 如何自动转换字符集 使用…

    PHP 2023年5月26日
    00
  • php数组函数array_push()、array_pop()及array_shift()简单用法示例

    PHP中的数组是非常重要的一种数据类型,它允许我们按照一定的顺序存储多个类型的值,并且可以方便地对数组进行增删改查等操作。本篇攻略将详细讲解PHP中三种常用的数组函数:array_push()、array_pop()、array_shift()的简单用法示例。 1. array_push() 函数 array_push()函数用于向数组末尾插入一个或多个元素…

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