单例对象会被jvm的gc时回收吗_【PHP设计模式】单例模式

前言

设计模式是我们开发过程中的重中之重,所以今天小编就来学习设计模式中的单例模式。

单例模式

<?php

class Singleton 
{ 
    /**
     * 定义一个静态变量保存已经实例化的对象
     * 
     * @var self|null
     */
    private static $_instance = null;

    /**
     * 构造函数私有,防止类可以通过 new 实例化
     * 
     * @access private
     * @return void
     */
    private function __construct () 
    { }

    /**
     * 私有化复制克隆方法,防止类别复制和克隆
     * 
     * @access private
     * @return void
     */
    private function __clone () 
    { }

    /**
     * 定义获取对象实例的入口,返回该实例
     * 
     * @access public
     * @return self
     */
    public static function getInstance () 
    { 
        // 判断是否已经存在实例化对象
        if (self::$_instance === null) { 
            // 不存在,则进行实例化
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    /**
     * 此接口用来测试单例模式 - 改变 string 的值
     * 
     * @access public 
     * @param string $string 值
     * @return void
     */
    public function setString ($string) 
    { 
        $this->string = $string;
    }

    /**
     * 此接口用来测试单例模式 - 输出 string 的值
     * 
     * @access public 
     * @return void
     */
    public function dumpString () 
    { 
        echo($this->string);
    }
}

// 测试,第一次实例化
$test1 = Singleton::getInstance();
echo('这是第一次实例化<br><br>');
$test1->setString('哈咯,小罗');
$test1->dumpString();

echo('<br><br><br>');

// 第二次实例化
echo('这是第二次实例化<br><br>');
$test2 = Singleton::getInstance();
$test2->dumpString();

echo('<br><br><br>');

// test2 修改 string 的数据
$test2->setString('哈咯,小罗,我是 test2 修改的数据<br><br>');

// 重新执行 test1 的打印方法,看看是否改变了数据
echo('重新执行 test1 的打印方法<br><br>');

$test1->dumpString();

接下来我们查看一下执行结果:

ffc970ef22d89a47e2f99ee23a42ecc3.png

由此我们可以看出,虽然我们实例化了两次,但两次得到的都是同一实例,如果其中一个修改了实例的成员,其它的都会被修改。

结语

  1. 对于整个程序运行过程中,使用的是同一个实例,并且需要频繁创建和销毁的对象,可以使用单例模式来减少系统的消耗;
  2. 需要注意,其中一个实例修改了其中一个变量,可能会影响到其它地方的使用;
  3. 单例模式没有抽象层,所以扩展起来很难;
  4. 如果单例对象长时间未使用,系统将会认为是垃圾,并进行自动销毁并回收资源,下次使用时,将重新实例化,这将导致单例对象数据的丢失;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值