前言
设计模式是我们开发过程中的重中之重,所以今天小编就来学习设计模式中的单例模式。
单例模式
<?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();
接下来我们查看一下执行结果:
由此我们可以看出,虽然我们实例化了两次,但两次得到的都是同一实例,如果其中一个修改了实例的成员,其它的都会被修改。
结语
- 对于整个程序运行过程中,使用的是同一个实例,并且需要频繁创建和销毁的对象,可以使用单例模式来减少系统的消耗;
- 需要注意,其中一个实例修改了其中一个变量,可能会影响到其它地方的使用;
- 单例模式没有抽象层,所以扩展起来很难;
- 如果单例对象长时间未使用,系统将会认为是垃圾,并进行自动销毁并回收资源,下次使用时,将重新实例化,这将导致单例对象数据的丢失;