和我一起学设计模式(—)
今天我们一起来学习单例模式:
首先要弄明白,什么叫单例模式?
概念: 在任何时候,应用程序中都只会有这个类仅有的一个实例存在。
单例模式也被认为是职责模式,因为它将创建对象的控制权委托到一个单一的访问点上。
其次,这么做的好处在哪?
这可以防止我们去打开数据库的多个连接或者不必要的使用多余的系统资源。在复杂的系统中,还可以起到维护应用程序状态的作用。
最后:它有哪些典型特征?
1.它至少要有一个构造函数,并且被标记为私有(private)
2.拥有一个保存类的实例的静态成员变量。
3.拥有一个可以访问这个实例的公共的静态方法。
和普通类不同的是,单例类不能在其它类中直接实例化,只能被其自身实例化。要做到这一点,必须要私有化它的构造函数,并且防止被克隆。用代码来实现一个单例,我们以创建数据库的连接为例:
//get data class
class DB {
private $_db;
private static $_instance;
private function __construct(){
$DSN = '../../content/xxtebook.db';
$this->_db = new PDO('sqlite:'.$DSN);
}
//初始化数据库连接
public static function initDB(){
if(! (self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
}
//其它方法
private function __clone(){}
public function query($sql){}
//....
}
在外部使用这个单例:
$db = DB::initDB();
//$db->somMethod();
另外对于哪些方法用静态,哪些方法不用,我的想法就是,如果方法内部要访问$this变量的,那么就不应当用静态方法,反之则可以用静态。也就是说,静态方法不需要通过例实对象就可以使用。
下一次我们再一起学习工厂模式