PHP设计模式系列(二)单例模式(Singleton)

教程帖子 2019年12月01日 阅读 120 豆浆大叔

前言

学而不思则罔 思而不学则殆,再努力一点,烂香蕉的故事从这里开始!

为什么使用单例模式 ,一下三点

  • 什么是单例模式?

作单例模式就是确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。就是说这个类的对象存储在内存中,占用一个地址,每当请求过来会先寻找,找到则直接返回对象,而不用再实例化操作。

  • 单例模式的三个重要结构
  1. 需要一个保存类的唯一实例的静态成员变量。
  2. 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本
  3. 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。
  • 我们为什么使用单例模式,解决了哪些痛点?
单例模式最常用的就是数据库实例化。若不采用单例模式,当程序中出现大量数据库操作时,每次都要执行new操作,
每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。使用了单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的耗费。同样对于使用比较频繁的类我们需要处理成单例模式,尽量降低资源的消耗,提高性能。

实现方法如下

/**
 * @desc 正常普通类
 * Class normal
 * @package liyangyang\DesignPatterns\Singleton
 */
class Normal
{

}

/**
 * @desc 单例类
 * Class Singleton
 * @package liyangyang\DesignPatterns\Singleton
 */
class Singleton
{
    /**
     * @desc 当前类的实例
     * @var null
     */
    private static $instance = null;

    /**
     * @desc 函数构造器  禁止从类外部实例化
     * Singleton constructor.
     */
    private function __construct()
    {

    }

    /**
     * @desc 创建一个静态方法来生成当前类的唯一实例
     * @access public
     * Author: 82年的烂香蕉
     * Date: 2019/12/1 下午9:31
     * @return Singleton|null
     */
    public static function getInstance()
    {
        if (self::$instance === null) { //检测当前类属性$instance是否已经保存了当前类的实例
            self::$instance = new self(); //如果没有,则创建当前类的实例
        }
        //存在就直接返回类实例
        return self::$instance;
    }

    /**
     * @desc 防止对象实例被克隆
     * @access public
     * Author: 82年的烂香蕉
     * Date: 2019/12/1 下午9:34
     */
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * @desc 防止被反序列化
     * @access public
     * Author: 82年的烂香蕉
     * Date: 2019/12/1 下午9:35
     */
    private function __wakeup()
    {
        // TODO: Implement __wakeup() method.
    }
}

$db1 = new Normal();
$db2 = new Normal();
$db3 = clone $db2;

var_dump($db1);
echo '<br>';
var_dump($db2);
echo '<br>';
var_dump($db3);
echo '<br>';


$db4 = Singleton::getInstance();
$db5 = Singleton::getInstance();

var_dump($db4);
echo '<br>';
var_dump($db5);
echo '<br>';

输出结果

总结:从上面运行代码我们可以看到;
普通test类的句柄每个都是不一样的;我们实例化多少个那么就是操作了多少次不同的对象(占用一定的资源)。
单例模式类实例化的句柄都是 5 ;从这里可以看出,第二次获取的是上一次实例化的对应句柄;

(设计模式一已完结)

豆浆大叔 豆浆大叔 资深PHP工程师@某一线大厂

写了 264486 字,被 3 人关注,共写了 75 篇笔记

(已更名,豆浆大叔)有理想的码农,不应该只探究人性的懒惰面,而是积极的去探索人生道路上的荆棘坎坷,努力提升自己完善自己!
推荐文章:
表情
  • [:821l1001:]
  • [:821l1002:]
  • [:821l1003:]
  • [:821l1004:]
  • [:821l1005:]
  • [:821l1006:]
  • [:821l1007:]
  • [:821l1008:]
  • [:821l1009:]
  • [:821l1010:]
  • [:821l1011:]
  • [:821l1012:]
  • [:821l1013:]
  • [:821l1014:]
  • [:821l1015:]
  • [:821l1016:]
  • [:821l1017:]
  • [:821l1018:]
  • [:821l1019:]
  • [:821l1020:]
  • [:821l1021:]
  • [:821l1022:]
  • [:821l1023:]
  • [:821l1024:]
  • [:821l1025:]
  • [:821l1026:]
  • [:821l1027:]
  • [:821l1028:]
  • [:821l1029:]
  • [:821l1030:]
  • [:821l1031:]
  • [:821l1032:]
  • [:821l1033:]
  • [:821l1034:]
  • [:821l1035:]
  • [:821l1036:]
  • [:821l1037:]
  • [:821l1038:]
  • [:821l1039:]
  • [:821l1040:]
  • [:821l1041:]
  • [:821l1042:]
  • [:821l1043:]
  • [:821l1044:]
  • [:821l1045:]
  • [:821l1046:]
  • [:821l1047:]
  • [:821l1048:]
  • [:821l1049:]
  • [:anger:]
  • [:applause:]
  • [:awkward:]
  • [:brokenheart:]
  • [:clown:]
  • [:confused:]
  • [:decline:]
  • [:diggingmouth:]
  • [:eyebrows:]
  • [:grinning:]
  • [:haha:]
  • [:ill:]
  • [:kiss:]
  • [:lascivious:]
  • [:laugh:]
  • [:love:]
  • [:lovely:]
  • [:rhinorrhea:]
  • [:smile:]
  • [:solid:]
  • [:strong:]
  • [:sweat:]
  • [:tearcollapse:]
  • [:tongue:]
  • [:uncomfortable:]
  • [:weak:]
  • [:worry:]
Tips:支持Markdown语法

0 个评论

抢座沙发~~~~
资深PHP工程师 @ 某一线大厂

登录

第三方账号登录:
GitHub
微信
微博