设计模式 - 单例模式

2017-04-05  本文已影响0人  patiencing
singleton_pattern

缘起

工作中写 API 接口, 需要连接数据库, 因为 MySQL 的连接资源是有限的, 所以为了避免因为反复连接数据库造成性能和资源的浪费, 所以考虑选择使用"单例模式"连接数据库.


"单例模式"的概念

"单例模式 / Singleton Pattern" 表示这个类只能造出一个对象. 如果用来连接数据库, 就能保证有且只连接一次数据库, 避免反复连接.


"单例模式"的特点及其逻辑推导

"单例模式"的主要特点“三私一公二静态”:
(这里为了让总结更简短, 把权限 privateprotected(即"非 public "的)统称为"私", 把权限 public 称为"公")

“三私一公二静态”逻辑推导:


"单例模式"的经典代码

class Single{
    private static $_instance;
    
    private function __construct(){
    }
    
    private function __clone(){
        
    }
    
    public static function getInstance(){
        if(!(self::$_instance instanceof Single)){
            self::$_instance = new self();
        }
        return self::$_instance ;
    }
}

检验"单例模式"的效果

为了检验是否"有且只能生成一个对象", 可以在构造函数中生成随机数, 然后检验两次实例产生的随机数是否相同:

class Single{
    private static $_instance;
    
    private function __construct(){
        $this->rand = mt_rand(1000, 9999);
    }
    
    private function __clone(){
        
    }
    
    public static function getInstance(){
        if(!(self::$_instance instanceof Single)){
            self::$_instance = new self();
        }
        return self::$_instance ;
    }
}

$a = Single::getInstance();
$b = Single::getInstance();
echo $a->rand;
echo "\n";
echo $b->rand;

两者输出的随机数是一致的, 所以可以说明"单例模式"是成功的.


使用"单例模式"连接数据库

基于上面的有效的单例模式代码, 用于连接数据库:

class Db{
private static $_instance;
private static $_connect;
private $_dbConfig = array(
    'host'=>'127.0.0.1',
    'user'=>'root',
    'pwd'=>'vagrant',
    'database'=>'tpshop',
);

private function __construct(){
}

private function __clone(){
}

public static function getInstance(){
    if (!(self::$_instance instanceof self)){
        self::$_instance = new self();
    }
    return self::$_instance;
}

public function connect(){
    if(!self::$_connect){
        self::$_connect = mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['pwd']);
        if(!self::$_connect){
            die( 'MySQL connect error'.mysql_error());
        }
        mysql_select_db($this->_dbConfig['databas'], self::$_connect);
        mysql_query('set names UTF8', self::$_connect);
    }
    return self::$_connect;
}
}

$connect = Db::getInstance()->connect();
var_dump($connect);

文章历史


如果你觉得我的文章对你有用, 请打个"喜欢", 或者给些改进的建议 _

上一篇 下一篇

猜你喜欢

热点阅读