设计模式专题(十七)——单例模式
(原创内容,转载请注明来源,谢谢)
一、概述
单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常会在类内部提供一个变量存储自身的实例,保证没有其他实例被创建,保证该实例是类的唯一实例。
单例模式可以严格控制客户的访问方式,保证唯一的实例。
二、多线程情况下的单例
当多线程中,多个线程同时访问类,还是有可能会创建出多个实例,则需要加锁。锁是为了保证代码处于临界区时,另一个线程不进入临界区。
当程序被上锁,其他访问的程序会阻塞,直等到锁被释放才可以访问。另外,需要在上锁之前加一层判断,如果类已经实例化,则直接返回类的实例,而不需要去加锁后再判断。
三、PHP中的单例模式
PHP由于很少涉及到多线程,因此通常不需要进行加锁。另外,由于PHP的页面被执行后,所有的变量都会被回收,这也使得PHP语言级别上无法实现变量的常驻(除非通过将实例化的遍历序列化后存在redis或memcache等缓存中实现)。
因此,对于php而言,单例模式通常是为了防止单个页面高并发的情况下,实例化太多类出现的问题。
最常见的就是对数据库的连接采用单例模式,因为mysql数据库有最大连接数限制,当大量的连接发生,会导致无法连接数据库,则可以实现单例模式。
四、单例模式要点
1、私有化构造函数和克隆函数
php的魔术方法构造函数和克隆函数,需要设置成private,这样用户就无法通过new的方式获取类的实例化。
2、定义一个私有化静态变量,用于存储类的实例化。
3、定义一个public的静态方法,去判断上述变量是否有内容,有则返回,没有则进行实例化。
五、单例模式实现数据库连接
<?php
//单例模式实现数据库连接
class Db{
private static $ins;
private static $conn;
private function__construct(){}
private function__clone(){}
public static functiongetInstance(){
if(null ==self::$ins || !(self::$ins instanceof self)){
self::$ins= new self();
self::$conn= new PDO('mysql:host=127.0.0.1;dbname=testdb,root,root');
}
returnself::$ins;
}
public functiongetConn(){
return$this->conn;
}
}
——written by linhxx 2017.08.15
相关阅读: