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

下面就让我来详细讲解一下 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 2023年5月27日
    00
  • php cli模式学习(PHP命令行模式)

    以下是关于“PHP CLI模式学习(PHP命令行模式)”的完整攻略。 什么是PHP CLI模式? CLI(Command Line Interface)模式是指在命令行(Windows下的cmd.exe或Linux、macOS下的终端)中运行PHP脚本,而非通过Web服务器(如Apache)来解析脚本。这意味着我们可以在不依赖Web服务器的情况下运行和测试P…

    PHP 2023年5月23日
    00
  • PHP几个数学计算的内部函数学习整理

    PHP数学计算函数 PHP提供了很多内部函数来进行数学计算,包括基本的加减乘除,以及三角函数、求幂、取余等高级数学运算。下面将详细介绍几个常用的PHP数学计算函数和用法。 abs — 绝对值 abs()函数可以用来获取数字的绝对值: echo abs(-4.2); // output: 4.2 round — 四舍五入到指定精度 round()函数可以用来将…

    PHP 2023年5月26日
    00
  • 使用ajaxfileupload.js实现ajax上传文件php版

    使用ajaxfileupload.js可以实现通过Ajax方式上传文件,本攻略将介绍如何使用ajaxfileupload.js上传文件并处理上传后的文件。 安装依赖 在使用ajaxfileupload.js之前需要安装jQuery,可以在官网下载,或者使用以下CDN: <script src="https://code.jquery.com/…

    PHP 2023年5月27日
    00
  • php str_pad() 将字符串填充成指定长度的字符串

    str_pad() 是 PHP 语言中一个用于字符串填充的函数,其主要作用是在原有的字符串中添加指定数量的字符,以将其填充至指定长度,常用于字符串对齐等操作。 函数签名如下: str_pad(string $input, int $pad_length, [string $pad_string = " "], [int $pad_type…

    PHP 2023年5月26日
    00
  • PHP实现的AES加密、解密封装类与用法示例

    PHP实现的AES加密、解密封装类与用法示例 简介 AES是目前最常用的对称加密算法,其应用范围非常广泛,如数据安全传输、文件加密等。PHP作为一种常用的语言,在实现AES加密、解密时也提供了很好的支持。 本文将介绍如何使用PHP实现AES加解密,并封装成简便的类文件。同时,本文会提供两个用例,让读者更好地了解如何使用该功能库。 实现AES加密、解密 PHP…

    PHP 2023年5月26日
    00
  • PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解

    PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解 创建文件 可以使用PHP的fopen()函数来创建文件,下面是示例代码: $filename = "example.txt"; $file = fopen($filename, "w") or die("无法创建文件"); fclose($f…

    PHP 2023年5月26日
    00
  • PHP 读取文件内容代码(txt,js等)

    下面是关于PHP读取文件内容的攻略: 准备工作 在开始读取文件之前,需要准备好要读取的文件,确保文件可读可写,以及被PHP所认可。一般来说,我们使用fopen()函数打开文件,代码如下: $file = fopen("file.txt", "r"); 上述代码实现了以只读方式打开名为“file.txt”的文件,若要进行…

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