香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 116|回复: 0

PHP 设计模式:单列模式介绍及使用(附源码)

[复制链接]

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-1-7 20:41:38 | 显示全部楼层 |阅读模式
单列模式介绍

单例设计模式(Singleton)属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例
学习过程中,最重要的是理解,如果都不了解用途及定义,那基本没办法刻在脑子里。
单:含义就是一个人,比如单身狗,
列:我不懂怎么组成了!还是,我就定义他 “例”吧,一个实例
那么组合成的人话就是:一个用例。
哦,忘了,他有个英文名字:singleton (所提及的)单项物,单个的人;单身男子(或女子);(非孪生的)单生儿,单生幼畜
那就更好了解了:一个实例的存在!
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
应用场景

那为什么有这个设计模式呢?如果连作用都不懂,我理解完后有有啥意义?
大多用于数据库连接,采用单例模式,只连接一次数据库,防止打开多个数据库连接。
运用用于一些只需要调用一次的场景。
应用介绍


  • 一个班级只有一个班主任。
  • Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
应用实现

大家大概也知道用于什么场景了,那么改如何实现呢。
要实现单列模式需要符合一下条件才能认为是单例。
1、单例类只能有一个实例。
就只用实例化一次,多个不行。
2、单例类必须自己创建自己的唯一实例。
必须由类内部去调用
3、单例类必须给所有其他对象提供这一实例
允许所有其他对象去调用这个类
满足以上三点即单列模式
那么如何实现呢?
1.用例代码

单列模式连接数据库
class database {
    private static $instance;

    private function __construct()
    {
        // 单例类不能直接实例化创建,而是只能由类本身实例化。
        // 因此,要获得这样的限制效果,构造函数必须标记为private,从而防止类被实例化。
    }

    private function __clone()
    {
        // // 在PHP中,为了防止他人对单例类实例克隆,通常还为其提供一个空的私有__clone()方法
    }
    // 2.单例类必须自己创建自己的唯一实例。
    // 3.并且单例类必须给所有其他对象提供这一实例
    public static function conn($server = '', $username = '', $password = '')
    {
        if (self::$instance instanceof self) {
            $con            = @mysqli_connect($server, $username, $password);
            self::$instance = $con;
        }

        return self::$instance;
    }
}

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例:
2.执行结果
$a = database::conn('localhost', 'root', '');
$b = database::conn('localhost', 'root', 'root');
// 1、单例类只能有一个实例。
var_dump($a == $b);
// bool(true)正常的单例,无论调用多少次,最终只会有一个实例。
非常的简单。那么有人就会问了,按正常的调用会是什么结果?
那我在下面试一下给大家看看。

不用单列模式用例
class database1 {
    public static $conn;

    public static function conn($server = '', $username = '', $password = '')
    {
        // 假设以下已连接完成数据库操作,并返回连接内容
        // ....
        $con = @mysqli_connect($server, $username, $password);

        self::$conn = $con;
        return self::$conn;
    }
}

$a = database1::conn('localhost', 'root', '');
$b = database1::conn('localhost', 'root', 'root');
var_dump($a == $b);
// bool(false)两者对比,明显看出,同样的连接方式,却不相同。这就是单列模式的用处。
那么单例模式介绍就没啦,是不是很简单。如果对你有帮助就点赞收藏吧~谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 11:33 , Processed in 0.611553 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表