zoukankan      html  css  js  c++  java
  • php设计模式——单例模式

    转载自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类从而失去单例模式意义
    • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用
  • 相关阅读:
    实现进制转化伪代码
    XOR算法
    最大公约数算法
    To be a hacker
    20191310《信息安全专业导论》第四周学习总结
    浪潮之巅阅读感想
    20191310 李烨龙 《信息安全导论》第二周学习
    git安装心得
    计算机概论阅读
    学业优秀者经验展示
  • 原文地址:https://www.cnblogs.com/ISeeYouBlogs/p/9231822.html
Copyright © 2011-2022 走看看