首页 > 生活 > PHP中单件模式(SingletonPattern)的实现

PHP中单件模式(SingletonPattern)的实现

2009年4月29日

单件(singleton)模式作为设计模式的一个典型而且简单的构造型模式, 已经在很多项目的实际开发中被广泛使用, 单件模式要求一个类有且仅有一个实例,然后提供一个全局的访问点.也就是其所有的相关操作都是基于同一个实例的引用.
单件模式的特点:

  • 单件类只能有一个实例
  • 单件类必须自己创建自己的唯一实例
  • 单件类必须给所有其它对象提供这一实例
  • 单件模式的优点:

  • 从逻辑上来讲, 仅有一个实例保证了逻辑的正确性
  • 通过共享减少的使用
  • 减少应为频繁的构造而带来的应用上的损失
  • 下面通过一个简单的例子来说一些单件模式
    在我们实际的应用中, 大家都知道数据库的连接资源是非常宝贵的, 通过数据库句柄到数据库的连接是独占的,每次的连接和关闭数据库都是一笔非常大的开销, 那么我们如何在应用程序中来共享数据库句柄呢? 我们可以通过单件模式实现.
    以下程序用到三个PHP文件, 程序只是为了展示单件模式,本身不具备任何价值.
    MySQL.php

    class MySQL {
    	private $dbhost = 'localhost';
    	private $dbuser = 'root';
    	private $dbpass = '123';
    	private $db	    = 'test';
     
    	public $guid;
     
    	//======================================
    	// 函数: connect()
    	// 功能: 连接数据库
    	// 返回:
    	//======================================
    	public function __construct()
    	{
    		$this->link_id = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
    		$this->guid = md5(uniqid());
    		if (!$this->link_id)
    		{
    			$this->halt("数据库连接失败.请检查连接参数.");
    			return;
    		}
     
    		if (!mysql_select_db($this->db, $this->link_id))
    		{
    			$this->halt("选择数据库".$this->db."失败.");
    			return;
    		}
    		mysql_query("SET NAMES 'utf8'");
    	}
    }

    Singleton.php

    <?php
    class Singleton {
    	private $_db;
    	private static $_single = null;
     
    	public static function getInstance() {
    		if (self::$_single === null)
    			self::$_single = new Singleton();
    		return self::$_single;
    	}
     
    	function __construct() {
    		$this->_db = new MySQL();
    	}
     
    	public function db() {
    		return $this->_db;
    	}
    }
     
    /* End of file */
    /* Location: */

    Test.php

    <?PHP
    require_once ('MySQL.php');
    require_once ('Singleton.php');
    header('content-type:text/html; charset=utf-8');
     
    echo '单件模式____________________________<br />';
    $s1 = Singleton::getInstance()->db();
    $s2 = Singleton::getInstance()->db();
    echo '$s1->guid:'.$s1->guid.'<br />';
    echo '$s1->guid:'.$s2->guid.'<br />';
    echo ($s1 === $s2) ? 'true' : 'false';
    echo '<br />';
     
    echo '直接实例化对象________________________________<br />';
    $d1 = new MySQL();
    echo '$d->guid:'.$d1->guid.'<br />';
    $d2 = new MySQL();
    echo '$d1->guid:'.$d2->guid.'<br />';
    echo ($d1 === $d2) ? 'true' : 'false';
    ?>

    将这三个文件放到一个目录中, 最后浏览test.php,可以看到
    通过单件模式获取的2个对象guid参数任何时候都是相同的,且这两个对象是恒等的.
    而直接实例出来的2个DB对象则刚好相反.
    通过比较, 相信你已经很轻松的掌握了单件模式的特点.

    转载请注明出处:http://www.suiyuan.org

    admin 生活

    1. 本文目前尚无任何评论.
    1. 本文目前尚无任何 trackbacks 和 pingbacks.