hti 发表于 2015-8-23 16:14:33

php设计模式——单例模式

单例模式概念

单例模式是指整个应用中类只有一个对象实例的设计模式。单例模式的特点


[*]一个类在整个应用中只有一个实例
[*]类必须自行创建这个实例
[*]必须自行向整个系统提供这个实例
php中使用单例模式的原因

我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。
贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:


[*]<?php
[*]class MysqlConn
[*]{
[*]    // MYSQL数据库连接信息
[*]    const MYSQLHOSTNAME = "127.0.0.1";
[*]    const MYSQLUSERNAME = "root";
[*]    const MYSQLPASSWORD = "***";
[*]    const MYSQLDBNAME = "test";
[*]    const MYSQLCHARSET = "utf8";
[*]      
[*]    /**
[*]    * Description:mysql数据库连接函数
[*]    * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息
[*]    */
[*]    public function MysqlConnect()
[*]    {
[*]      $db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME); // 连接数据库
[*]      $db->set_charset(self::MYSQLCHARSET);
[*]      if (mysqli_connect_errno())
[*]      {
[*]            throw new CircleMysqlException("服务器系统故障", 1001);
[*]      }
[*]      else
[*]      {
[*]            return $db;
[*]      }
[*]    }
[*]}

缺陷:
每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回close掉,频繁的new和数据库连接关闭操作是非常消耗资源的  改进:
  每次应该直接返回当前应用中已经打开的数据库连接句柄



[*]//单例模式返回数据库连接句柄
[*]$db = MysqlConn::SingleMysqlConnect();
php单例模式的实现



[*]<?php
[*]class Singleton
[*]{
[*]    /**
[*]   * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关
[*]   *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空
[*]   */
[*]    private static $instance;
[*]      
[*]    /**
[*]   * Description:数据库连接句柄
[*]   */
[*]    private $db;
[*]      
[*]    /**
[*]   * Description:私有化构造函数,防止外界实例化对象
[*]   */
[*]    private static function __construct()
[*]    {
[*]    }
[*]      
[*]    /**
[*]   * Description:私有化克隆函数,防止外界克隆对象
[*]   */
[*]    private function __clone()
[*]    {
[*]    }
[*]      
[*]    /**
[*]   * Description:静态方法,单例访问统一入口
[*]   * @return Singleton:返回应用中的唯一对象实例
[*]   */
[*]    public static function GetInstance()
[*]    {
[*]      if (!(self::$instance instanceof self))
[*]      {
[*]            self::$instance = new self();
[*]      }
[*]      return self::$instance;
[*]    }
[*]      
[*]    /**
[*]   * Description:获取数据库的私有方法的连接句柄
[*]   */
[*]    public function GetDbConnect()
[*]    {
[*]      return $this->db;
[*]    }
[*]}


[*]需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
[*]构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
[*]必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用
页: [1]
查看完整版本: php设计模式——单例模式