单例模式(Singleton Pattern):
单例模式是实现一个类只有一个实例,而且往往是整个系统中只有一个该实例。
单例模式也是一个创造型的模式
在实例化数据库,缓存,日志中比较常用
那么它是怎么做到的呢
1:要确保一个类只有一个实例,我们用私有静态成员变量来保存这个实例
private static $_instance;
2:构造函数和克隆函数必须声明为私有,防止外部程序new类
// 私有化构造方法,防止new实例 private function __construct() { } // 覆盖__clone()方法,禁止克隆 private function __clone() { }
3:必须要提供一个能访问这个存私有静态成员变量的公共函数,返回唯一实例的引用
// 用于返回对象实例的公共静态方法 public static function getInstance() { // 判断当前实例是否已经创建 if (!(self::$_instance instanceof self) ) { // 如果没有,则创建 self::$_instance = new self(); } // 最终返回实例 return self::$_instance; }
来写一个例子:
<?php /** * Class DB 数据库操作类 */ class Db { private $_db; private static $_instance; // 私有化构造方法,防止外部new实例 private function __construct() { // 这里主要用于连接数据库,细节此处省略 $this->_db = this->connect_db(); } private function connect_db() { } // 覆盖__clone()方法,禁止克隆 private function __clone() { } // 返回对象实例 public static function getInstance() { // 判断是否存在对象实例 if(! (self::$_instance instanceof self) ) { // 不存在则创建保存 self::$_instance = new self(); } // 返回对象实例 return self::$_instance; } // 其他方法 public function query(...) { } // 其他方法 public function insert(...) { } }
在单例模式的实现过程中,需要注意如下三点:
单例类的构造函数为私有;
提供一个自身的静态私有成员变量;
提供一个公有的静态工厂方法