PHP设计模式之单例模式(Singleton Pattern)

应用场景

数据库连接器
日志记录器
应用锁文件 (理论上整个应用只有一个锁文件 …)

结构

四个私有一个公共
私有化构造方法: 防止使用 new 创建多个实例;
私有化克隆方法: 防止 clone 多个实例;
私有化重建方法: 防止反序列化
私有化静态属性: 防止直接访问存储实例的属性

Demo
<?php
/**
 * 普通类
 * Class Db1
 */
class Db1
{
    
    
    public static $instance = null;

    public static function getInstance()
    {
    
    
        if (null === static::$instance) {
    
    
            static::$instance = new static();//实例化自身
        }

        return static::$instance;
    }

    public function __construct()
    {
    
    
    }

    public function __clone()
    {
    
    
    }

    public function __wakeup()
    {
    
    
    }

}
$db1 = new Db1();
$db2 = new Db1();
$db3 = clone $db2;
$db4 = Db1::getInstance();
$db5 = unserialize(serialize($db4));


var_dump($db1);
echo '<hr>';
var_dump($db2);
echo '<hr>';
var_dump($db3);
echo '<hr>';
var_dump($db4);
echo '<hr>';
var_dump($db5);
echo '<hr>';
//打印结果
object(Db1)#1 (0) { }
object(Db1)#2 (0) { }
object(Db1)#3 (0) { }
object(Db1)#4 (0) { }
object(Db1)#5 (0) { }

在这里插入图片描述

/**
 * 单例
 * Class Db2
 */
class Db2
{
    
    
    private static $instance = null;

    public static function getInstance()
    {
    
    
        if (null === static::$instance) {
    
    
            static::$instance = new static();
        }

        return static::$instance;
    }

    /**
     * 防止使用 new 创建多个实例
     *
     * Db2 constructor.
     */
    private function __construct()
    {
    
    
    }

    /**
     * 防止 clone 多个实例
     */
    private function __clone()
    {
    
    
    }

    /**
     * 防止反序列化
     */
    private function __wakeup()
    {
    
    
    }
}

$db6 = Db2::getInstance();
$db7 = Db2::getInstance();

var_dump($db6);
echo '<hr>';
var_dump($db7);
echo '<hr>';
//输出结果 实例化后对象被存储 程序自始至终只做一次实例化
object(Db2)#6 (0) { }
object(Db2)#6 (0) { }

猜你喜欢

转载自blog.csdn.net/qq_41526316/article/details/108495826
今日推荐