php常用设计模式应用场景及示例

本文详细介绍了单例模式、工厂模式、策略模式、观察者模式和装饰器模式在IT技术中的应用,包括它们的含义、代码示例和使用场景,强调了这些模式如何提高代码灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式


  • 含义描述

    应用程序中最多只有该类的一个实例存在

  • 应用场景

    常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。

  • 代码示例

    class Singleton {
         
        private static $instance; // 定义一个私有的静态变量保存类的实例
        
        private function __construct() {
         } // 将构造函数设为私有,防止外部直接创建对象
        
        public static function getInstance() {
         
            if (!self::$instance) {
          // 如果没有实例化则进行实例化操作
                self::$instance = new self();
            }
            
            return self::$instance; // 返回已经实例化好的对象
        }
    }
     
    // 调用单例模式获取实例
    $obj1 = Singleton::getInstance();
    $obj2 = Singleton::getInstance();
     
    var_dump($obj1 === $obj2); // true,两次获取到的都是同一个实例
    

工厂模式


  • 含义描述

    工厂设计模式常用于根据输入参数的不同或者应用程序配置的不同来创建一种专门用来实例化并返回其对应的类的实例

  • 应用场景

    1.后台数据导出:比如可导出文件类型有excel、csv、xml等,同样都是实现导出功能,但是要实例化的类是不同的,实现逻辑也不相同;

    2.支付系统:根据用户选择的支付方式实例化不同的支付类,比如积分、微信、支付宝等支付

    3.缓存功能:一般有文件缓存、session、cookie等,他们的实例也是不同的。

  • 代码示例

    <?php
    
    // 定义接口,定义所有对象的通用方法
    interface ShapeInterface
    {
         
        public function draw();
    }
    
    // 实现接口的具体类,画一个圆形
    class Circle implements ShapeInterface
    {
         
        public function draw()
        {
         
            echo "Drawing a circle.\n";
        }
    }
    
    // 实现接口的具体类,画一个长方形
    class Rectangle implements ShapeInterface
    {
         
        public function draw()
        {
         
            echo "Drawing a rectangle.\n";
        }
    }
    
    // 工厂类
    class ShapeFactory
    {
         
        // 根据传入的形状类型生成对应的对象
        public static function createShape($shapeType)
        {
         
            if ($shapeType == 'circle') {
         
                return new Circle();
            } elseif ($shapeType == 'rectangle') {
         
                return new Rectangle();
            } else {
         
                throw new Exception("Invalid shape type: " . $shapeType);
            }
        }
    }
    
    // 使用工厂类生成对象并调用方法
    try {
         
        $circle = ShapeFactory::createShape('circle');
        $circle->draw();
    
        $rectangle = ShapeFactory::createShape('rectangle');
        $rectangle->draw();
    
        // 尝试创建无效的形状类型
        $invalidShape = ShapeFactory::createShape('triangle');
    } catch (Exception $e) {
         
        echo "Error: " . $e->getMessage();
    }
    
    输出结果:
    Drawing a circle.
    Drawing a rectangle.
    Error: Invalid shape type: triangle
    

    在这个示例中,我们定义了一个ShapeInterface接口,它包含了一个draw()方法,用于绘制形状。然后,我们创建了两个实现该接口的具体类Circle和Rectangle,它们分别实现了draw()方法来绘制圆形和矩形。

    接下来,我们创建了一个ShapeFactory工厂类,它包含一个静态方法createShape(),该方法根据传入的形状类型(字符串)生成相应的对象实例。在createShape()方法中,我们根据传入的形状类型使用条件语句创建对应的对象,并返回该对象。如果传入的形状类型无效,我们将抛出一个异常。

    最后,我们使用ShapeFactory类来生成圆形和矩形的对象,并调用它们的draw()方法来绘制形状。同时,我们也尝试创建一个无效的形状类型(三角形),以演示异常处理机制。

策略模式


  • 含义描述

    策略设计模式是一种行为设计模式,它允许你在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改应用场景

  • 应用场景

    1. 商城促销方式:对秒杀、满减、打折等不同促销方式用不同的算法计算不同的结算价格
    2. 日志系统:根据日志的类型做不同的响应
  • 代码示例

    //我们将以一个简单的日志记录系统为例,其中我们可以选择不同的日志策略来记录信息。
    
    //首先,我们定义一个日志策略接口:
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值