zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式概念

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

    单例模式的特点

        一个类在整个应用中只有一个实例
        类必须自行创建这个实例
        必须自行向整个系统提供这个实例

    php中使用单例模式的原因

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

    1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

    2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

    3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
    贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:

        <?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))//(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口。  
                {  
                    self::$instance = new self();  
                }  
                return self::$instance;  
            }  
              
            /**
             * Description:获取数据库的私有方法的连接句柄
             */  
            public function GetDbConnect()  
            {  
                return $this->db;  
            }  
        }  

     转发www.cnblogs.com/lh460795/p/3225650.html

  • 相关阅读:
    调用系统相机导致照片旋转问题的修复
    JavaLearning:日期操作类
    PHP实现事件机制实例分析
    按下葫芦起了瓢
    win系统下的eclipse连接和使用linux上的hadoop集群
    利用gradle加入构建版本
    从设计到实现,一步步教你实现Android-Universal-ImageLoader-辅助类
    I帧、P帧和B帧的特点
    tcp_tw_recycle检查tcp_timestamps的内核代码
    OBS源码编译开发
  • 原文地址:https://www.cnblogs.com/aten/p/8421670.html
Copyright © 2011-2022 走看看