1,什么是单例模式
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
2,单例模式的特点
三私一公:私有的静态变量(存放实例),私有的构造方法(防止创建实例),私有的克隆方法(防止克隆对象),公有的静态方法(对外界提供实例)
3,单例模式三要素
只能有一个实例,必须拥有一个构造函数,并且必须被标记为private
必须自行创建这个实例,拥有一个保存类的实例的静态成员变量
必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。
4,单例模式的优势
使用单例模式的好处很大,以数据库操作为例。若不采用单例模式,当程序中出现大量数据库操作时,每次都要执行new操作,
每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。使用了单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的耗费。
5,单例模式示例
以Redis为例
class Redis
{
public $redis = "";
protected $options = [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 0,
'persistent' => false,
'prefix' => '',
'serialize' => true,
];
private static $_instance;
//构造器私有化:禁止从类外部实例化
private function __construct() {
$this->redis = new \Redis();
$result = $this->redis->connect($this->options['host'], $this->options['port'], $this->options['timeout']);
if($result === false) {
throw new \Exception('redis connect error');
}
}
//克隆方法私有化:禁止从外部克隆对象
private function __clone(){}
//单例访问统一入口
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
/**
* 取值
* @param $key
* @return bool|string
*/
public function get($key) {
if(!$key) {
return '';
}
return $this->redis->get($key);
}
}
6,控制器调用
use test\Redis;
class Index
{
public function index()
{
echo Redis::getInstance()->get("key");
}
}