【设计模式】单例模式

设计模式

 

一、介绍

单例模式是一种创建型设计模式让你能够保证一个类只有一个实例并提供一个访问该实例的全局节点

 

二、单例模式优缺点

优点:

  • 仅在首次请求单例对象时对其进行初始化
  • 你可以保证一个类只有一个实例
  • 获得了一个指向该实例的全局访问节点

缺点

  • 违反了单一职责原则
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象
  • 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。

 

三、实现步骤

  1. 在类中添加一个私有的静态成员变量用于保存单例实例。
  2. 声明一个公有静态构建方法用于获取单例实例。
  3. 在静态方法首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
  4. 将类的构造函数设为私有。

 

四、具体实现

1、单例类

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/3
 * Time: 10:05
 */

namespace app\admin\service\singleton;

/**
 * 单例模式
 */
class SingletonService
{
    /**
     * 私有的静态变量保存类的唯一实例
     */
    private static ?SingletonService $instance = null;

    /**
     * 私有构造函数,防止外部实例化
     */
    private function __construct(){

    }

    /**
     * 获取类的唯一实例
     * @return SingletonService|null
     * @Author: fengzi
     * @Date: 2024/4/3 10:10
     */
    public static function getInstance() :SingletonService
    {
        if(self::$instance === null){
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 防止对象被克隆
     * @return void
     * @Author: fengzi
     * @Date: 2024/4/3 10:10
     */
    private function __clone(){

    }

    /**
     * 防止反序列化导致实例化
     * @return void
     * @throws \Exception
     * @Author: fengzi
     * @Date: 2024/4/3 10:10
     */
    public function __wakeup(){
        throw new \Exception("Cannot unserialize singleton");
    }
}

 

2、客户端调用

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/3
 * Time: 10:02
 */

namespace app\admin\controller\singleton;

use app\admin\service\singleton\SingletonService;

class SingletonController
{
    public function index()
    {
        $s1 = SingletonService::getInstance();
        $s2 = SingletonService::getInstance();
        if ( $s1 === $s2 ) {
            echo '是同一个实例';
        } else {
            echo '不是同一个实例';
        }
    }

}

 

3、调用结果展示

 

posted @ 2024-04-03 10:19  疯子丶pony  阅读(34)  评论(0编辑  收藏  举报