php設計模式——單例模式


單例模式概念

單例模式是指整個應用中類只有一個對象實例的設計模式。

單例模式的特點

  • 一個類在整個應用中只有一個實例
  • 類必須自行創建這個實例
  • 必須自行向整個系統提供這個實例

php中使用單例模式的原因

我用php大部分操作都是和各種數據庫打交道,包括mysql,redis,memcache等各種關系型和非關系型數據庫,所以一個應用中會 存在大量連接數據庫的操作,如果不用單例模式,那每次都要new操作,但是每次new都會消耗大量的內存資源和系統資源,而且每次打開和關閉數據庫連接都 是對數據庫的一種極大考驗和浪費。
貼出我之前常用的不好的數據庫連接代碼,給大家一個錯誤示范:
  1. <?php  
  2. class MysqlConn  
  3. {  
  4.     // MYSQL數據庫連接信息  
  5.     const MYSQLHOSTNAME = "127.0.0.1";  
  6.     const MYSQLUSERNAME = "root";  
  7.     const MYSQLPASSWORD = "***";  
  8.     const MYSQLDBNAME = "test";  
  9.     const MYSQLCHARSET = "utf8";  
  10.       
  11.     /** 
  12.     * Description:mysql數據庫連接函數 
  13.     * Return value:連接成功返回數據庫連接句柄;連接失敗返回錯誤消息 
  14.     */  
  15.     public function MysqlConnect()  
  16.     {  
  17.         $db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME); // 連接數據庫  
  18.         $db->set_charset(self::MYSQLCHARSET);  
  19.         if (mysqli_connect_errno())  
  20.         {  
  21.             throw new CircleMysqlException("服務器系統故障", 1001);  
  22.         }  
  23.         else  
  24.         {  
  25.             return $db;  
  26.         }  
  27.     }  
  28. }  

缺陷:
每次數據庫連接都要new這個類,然后調用mysqlconnect方法,返回close掉,頻繁的new和數據庫連接關閉操作是非常消耗資源的

改進:

每次應該直接返回當前應用中已經打開的數據庫連接句柄

 
  1. //單例模式返回數據庫連接句柄  
  2. $db = MysqlConn::SingleMysqlConnect();  

php單例模式的實現

  1. <?php  
  2. class Singleton  
  3. {  
  4.     /** 
  5.      * Description:(1)靜態變量,保存全局實例,跟類綁定,跟對象無關 
  6.      *             (2)私有屬性,為了避免類外直接調用 類名::$instance,防止為空 
  7.      */  
  8.     private static $instance;  
  9.       
  10.     /** 
  11.      * Description:數據庫連接句柄 
  12.      */  
  13.     private $db;  
  14.       
  15.     /** 
  16.      * Description:私有化構造函數,防止外界實例化對象 
  17.      */  
  18.     private static function __construct()  
  19.     {  
  20.     }  
  21.       
  22.     /** 
  23.      * Description:私有化克隆函數,防止外界克隆對象 
  24.      */  
  25.     private function __clone()  
  26.     {  
  27.     }  
  28.       
  29.     /** 
  30.      * Description:靜態方法,單例訪問統一入口 
  31.      * @return Singleton:返回應用中的唯一對象實例 
  32.      */  
  33.     public static function GetInstance()  
  34.     {  
  35.         if (!(self::$instance instanceof self))  
  36.         {  
  37.             self::$instance = new self();  
  38.         }  
  39.         return self::$instance;  
  40.     }  
  41.       
  42.     /** 
  43.      * Description:獲取數據庫的私有方法的連接句柄 
  44.      */  
  45.     public function GetDbConnect()  
  46.     {  
  47.         return $this->db;  
  48.     }  
  49. }  
  • 需要一個保存類的唯一實例的靜態成員變量(通常$instance為私有變量)
  • 構造函數和克隆函數必須聲明為私有的,為了防止外部程序new類從而失去單例模式意義
  • 必須提供一個訪問這個實例的公共靜態方法,從而返回唯一實例的一個引用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM