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代码中使用换行及(\n或\r\n和br)的应用

    在 PHP 开发中,我们常常需要输出一些带有换行的文本,这时就需要使用到换行符。本文将为大家详细介绍 PHP 代码中使用换行及(\n 或 \r\n 和)的应用,包括它们的定义、使用场景以及示例说明。 \n和\r\n的定义 在 PHP 中,\n 表示换行符,\r 表示回车符。它们通常都是配合另一个字符一起使用,例如\n或\r\n就表示换行。其中,\n 是 *n…

    PHP 2023年5月23日
    00
  • PHP中将一个字符串部分字符用星号*替代隐藏的实现代码

    要将 PHP 中的一个字符串部分字符用星号 * 替代隐藏,可以通过以下步骤实现: 使用 substr() 函数获取字符串中的部分字符; 使用 str_repeat() 函数生成相同长度的星号 * 字符串; 使用str_replace() 函数将原字符串中的需要替换的部分替换为星号 *; 将原字符串和星号 * 部分替换后的字符串拼接在一起,即可得到隐藏部分字符…

    PHP 2023年5月26日
    00
  • php采集神器cURL使用方法详解

    PHP采集神器cURL使用方法详解 在进行网站开发或爬取数据时,我们常常需要通过网络请求获取网站的数据。而php采集神器cURL便是其中之一。本文将详细讲解cURL的使用方法。 cURL简介 cURL是一个强大且灵活的开源库,支持包括HTTP、HTTPS、FTP等多种协议。cURL同时也提供了强大而丰富的功能,包括:HTTP认证、SSL支持、HTTP POS…

    PHP 2023年5月27日
    00
  • php后台多用户权限组思路与实现程序代码分享

    下面是对应的完整攻略,包含思路与实现程序代码分享: 思路 多用户权限组的实现,首先需要明确以下概念: 用户:指的是具体的网站管理者,拥有自己的账号、密码等信息; 权限:指的是用户在网站后台能够进行的操作,比如发布文章、修改用户信息等; 角色:指的是对用户进行分类和管理的方式,将各个用户分成不同的角色,每个角色具有不同的权限。 因此,实现多用户权限组的关键是要…

    PHP 2023年5月26日
    00
  • 微信公众平台小程序怎么申请并认证?

    当您要在微信公众平台上开发和发布小程序时,需要先进行小程序的申请和认证。下面是关于微信公众平台小程序申请和认证的完整攻略。 1. 注册微信公众平台账号 在微信公众平台官网进入“注册”页面,登录并按照流程填写各项信息来注册微信公众平台账号。 2. 登录微信公众平台账号 在注册完微信公众平台账号之后,登录微信公众平台账号。 3. 进入小程序管理页面 进入微信公众…

    PHP 2023年5月23日
    00
  • 如何使用php输出时间格式

    使用 PHP 输出时间格式可以通过 date() 函数实现。date() 函数需要传入两个参数,一个是时间格式,一个是可选的时间戳(默认为当前时间)。 以下是一些常用的时间格式: 格式 描述 Y 年份(四位数) y 年份(两位数) m 月份(有前导零) n 月份(没有前导零) M 月份的缩写(Jan – Dec) d 日期(有前导零) j 日期(没有前导零)…

    PHP 2023年5月26日
    00
  • 解析PHP之提取多维数组指定列的方法

    接下来我将详细讲解“解析PHP之提取多维数组指定列的方法”的完整攻略。 前言 PHP是一种服务器端脚本语言,其中数组是其最常用的数据类型之一。在PHP开发过程中,开发者经常需要从多维数组中提取指定的一列,这时候就需要使用PHP的相关函数来实现这个功能了。 方法一:使用foreach循环 使用foreach遍历多维数组,然后将指定列的值取出来,再组成一个新的数…

    PHP 2023年5月26日
    00
  • PHP5常用函数列表(分享)

    PHP5常用函数列表(分享)详解 介绍 在 PHP5 中,有很多常用的函数可以帮助我们完成一些基本的操作,如处理字符串、操作数组、操作数据库等。这篇文章主要是为了分享 PHP5 常用的函数列表。 字符串处理函数 PHP5 提供了丰富的字符串处理函数,下面列出了几个常用的: strlen strlen()函数用于获取字符串的长度。示例代码如下: $str = …

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