php设计模式 Singleton(单例模式)

yizhihongxing

下面就让我来详细讲解一下 PHP 设计模式 Singleton(单例模式)的完整攻略。

什么是单例模式?

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并且提供了一个全局访问点来访问这个实例。单例模式通常用于管理共享资源,例如数据库连接、日志文件等等。

单例模式的使用场景

当一个类的实例化需要耗费很多资源的时候,或者介于全局变量和局部变量之间,适合使用单例模式。

单例模式的实现方法

饿汉式实现

饿汉式实现是指单例模式在类加载的时候就创建了实例,因此也叫做静态单例模式。这种方式实现简单,线程安全,但是可能会浪费一些资源,因为不一定每次都需要实例化这个对象。实现方法如下:

class Singleton
{
    private static $instance = new Singleton();

    private function __construct()
    {
    }

    public static function getInstance(): Singleton
    {
        return self::$instance;
    }
}

懒汉式实现

懒汉式实现是指单例模式只有在第一次使用的时候才创建实例。这种实现方式避免了内存浪费的问题,但是需要考虑线程安全性问题。实现方法如下:

class Singleton
{
    private static $instance;

    private function __construct()
    {
    }

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

这种方式有一个线程安全问题,可能会出现同时创建两个实例的情况。可以在 getInstance 方法上加锁来解决。

class Singleton
{
    private static $instance;

    private function __construct()
    {
    }

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

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

单例模式的示例代码

下面给出两个单例模式的示例代码。

示例代码一:日志类

在例子中,我们模拟了一个日志类。日志类通过单例模式实现了只有一个实例,可以全局调用。

class Log
{
    private static $instance;
    private $logs = [];

    private function __construct()
    {
    }

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

    public function add($log)
    {
        $this->logs[] = $log;
    }

    public function printLogs()
    {
        foreach ($this->logs as $log) {
            echo $log . "\n";
        }
    }
}

// example usage
$log = Log::getInstance();
$log->add('log 1');
$log->add('log 2');
$log->add('log 3');
$log->printLogs();

示例代码解析:

  1. Log 类是一个单例类,它只需要在第一次使用的时候实例化,所以我们在 getInstance 方法中实现单例模式。
  2. add 方法用于添加一条日志,printLogs 方法用于打印所有的日志。

示例代码二:数据库连接类

在例子中,我们模拟了一个数据库连接类。数据库连接类通过单例模式实现了保证只有一个数据库连接实例。

class Database
{
    private static $instance;
    private $db;

    private function __construct()
    {
        $this->db = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
    }

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

        return self::$instance;
    }

    public function query($sql)
    {
        return $this->db->query($sql);
    }
}

// example usage
$db = Database::getInstance();
$result = $db->query('SELECT * FROM users');
foreach ($result as $row) {
    echo $row['id'] . ':' . $row['name'] . "\n";
}

示例代码解析:

  1. Database 类是一个单例类,它只需要在第一次使用的时候实例化,所以我们在 getInstance 方法中实现单例模式。
  2. query 方法用于执行 SQL 查询,返回的是 PDOStatement 对象。

以上就是单例模式的完整攻略。单例模式在实际开发中非常常见,可以想象在一个应用程序中,可能需要访问的资源非常多,而我们不希望每次都去创建全新的实例,而是希望尽可能的减少资源的消耗。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php设计模式 Singleton(单例模式) - Python技术站

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

相关文章

  • PHP生成压缩文件实例

    关于如何用PHP生成压缩文件,可以使用PHP的ZipArchive类来实现。具体的步骤如下: 1. 创建ZipArchive对象 首先需要创建一个ZipArchive对象。代码如下: $zip = new ZipArchive(); 2. 开始创建压缩包 创建好ZipArchive对象后,需要使用ZipArchive对象的open方法来打开一个压缩包文件。如…

    PHP 2023年5月26日
    00
  • php+MySql实现登录系统与输出浏览者信息功能

    实现登录系统和输出浏览者信息是 Web 开发中非常基础的功能,可以通过 PHP 和 MySQL 来完成。 创建数据库和用户表 首先,需要创建一个 MySQL 数据库,然后创建一个用户表,包含用户名和密码的字段。可以使用以下 SQL 语句创建: CREATE DATABASE `user_db`; USE `user_db`; CREATE TABLE `us…

    PHP 2023年5月26日
    00
  • Typecho插件实现添加文章目录的方法详解

    下面是“Typecho插件实现添加文章目录的方法详解”的完整使用攻略,包括插件描述、插件分析、插件使用和两个示例。 插件描述 Typecho是一款轻量级的PHP博客程序,它具有简单、易用、高效等特点。在Typecho中我们可以使用插件来扩展其功能。本篇攻略将介绍一款Typecho插件,它可以实现在文章中添加目录的功能。 插件分析 以下是该插件的分析: 插件名…

    PHP 2023年5月12日
    00
  • ID中如何使用插件编辑数学公式?InDesign中的数学公式插件用法

    在InDesign中,我们可以使用MathTools这个数学公式插件来编辑数学公式。下面是具体的操作流程。 步骤一:安装MathTools插件 首先,我们需要将MathTools插件安装到InDesign中。插件的安装方法为,在InDesign中点击“菜单栏 > 编辑 > 首选项 > 常规”打开常规设置窗口,在该窗口内点击“插件”选项卡,在…

    PHP 2023年5月26日
    00
  • php随机抽奖实例分析

    下面是关于“PHP随机抽奖实例分析”的完整攻略,包括步骤、代码示例和注意事项等: 1. 确定随机抽奖奖项及概率 在进行随机抽奖之前,需要确定参与抽奖的奖项及其对应的概率。通常,我们会给不同的奖项赋予不同的概率,以保证公平性和悬念。 比如,我们设置了三个奖项:一等奖、二等奖和三等奖,并分别设置其中奖概率为10%、30%和60%。 2. 开始抽奖 在确定奖项及概…

    PHP 2023年5月23日
    00
  • PHP implode()函数用法讲解

    PHP implode()函数用法讲解 简介 PHP中的implode()函数是一个非常常用的字符串函数,它的作用是将一个一维数组的值转化为字符串。 语法 implode(separator,array) 参数 separator: 可选,默认为”,指定分割字符串。 array: 必需,要转换为字符串的数组。 返回值 返回将数组中的元素组合为字符串后的结果…

    PHP 2023年5月27日
    00
  • PHP中的string类型使用说明

    下面是“PHP中的string类型使用说明”的完整攻略。 概述 在PHP中,string类型是一种常见的变量类型,它用于存储文本字符串。string类型的变量可以包含任何字符(包括数字、字母、标点符号等)。 定义 定义一个string类型的变量很简单,只需要在变量名前加上$符号,并将其赋值为一个字符串即可。示例代码如下: $string1 = "H…

    PHP 2023年5月26日
    00
  • PHP实现图片旋转的方法详解

    以下是关于“PHP实现图片旋转的方法详解”的完整使用攻略: 基础知识 在了解PHP实现图片旋转方法之前,需要掌握一些基础知识,包括PHP GD库的基本用法、PHP GD库中的图像旋转函数、PHP GD库中的图像处理函数等。以下是一些常见的基础知识: PHP GD库的基本用法,包括GD库的安装、GD库的基本函数等。 PHP GD库中的图像旋转函数,包括imag…

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