美文网首页
设计模式之单例模式

设计模式之单例模式

作者: Acto | 来源:发表于2021-07-02 21:32 被阅读0次

题记:关于单例模式,今天被朋友问到,突然间脑梗,回答不上来,简直要被笑死啊😫😫😫
这里不讲太多书面概念,没意思,毕竟我觉得真他妈记不住书面概念。

1、单例模式解决什么问题?

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这样一来,当对象A对单例的某个属性做了赋值,那么对象B再去获取这个属性的值,获取到的是赋值后的新值。

单例模式应用场景
1、数据库连接
在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。
2、日志操作类:记录、操作系统日志等
3、请求管理类:接收请求,获取http头部信息等
4、配置管理类

2、单例模式的特点

1.只能有一个实例
2.必须自行创建这个实例
3.必须给其他对象提供这一实例

3、怎么实现单例模式

直接上代码,代码有注释很清楚了

<?php
/**
 * 单例模式:系统中所有对象都使用同一个A对象(单例)
 * 要点:
 * 1、创建无法从其自身外部来创建实例的类,只要将构造函数定义为私有的就可以)
 * 2、定义一个private的静态属性$instance(用来表示系统中的这个单例,并且不能被类外部直接访问)
 * 3、定义一个public的静态方法getInstance(用来实例化自身对象)
 * 4、用静态方法getInstance来实例化自身,并赋值给静态属性$instance
 */

class A
{
    private $count = 1;
    private static $instance = null;//定义为私有的(不让类外部直接访问)

    /**
     * A constructor.
     * 构造函数定义为私有,不允许自身外部来实例化
     */
    private function __construct()
    {
        //这里可以根据实际需要写构造函数内容

    }

    /**
     * 定义为静态方法,1、访问自身内部的静态属性$instance;2、系统的任何地方可以调用该方法
     * @return A|null
     */
    public static function getInstance()
    {
        if (self::$instance == null){
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->count++;
    }

    public function show()
    {
        var_dump($this->count);
    }
}

$a = A::getInstance();
$a->add();
$a->show();
unset($a);//移除引用

$b = A::getInstance();
$b->show();//这里虽然$b并没有执行add()方法,但是类属性$count还是等于2,这就是单例的特点

//如果尝试用new来实例化的话
//$c = new A();
//Fatal error: Uncaught Error: Call to private A::__construct() from invalid context
//如果需要A类的实例化对象,只能通过开放的getInstance静态方法进行初始化

相关文章

网友评论

      本文标题:设计模式之单例模式

      本文链接:https://www.haomeiwen.com/subject/iwyyultx.html