学习设计模式是一个痛苦的过程,记录一下学习过程。设计模式有点类似于太极拳,谁都能略知一二,而真正能运用自如,难度却很大。下边将用PHP作为开发语言,来学习设计模式,今天先从最简单的模式开始——单例模式(Singleton)。
1、定义
Singleton(单例或者单件)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、代码示例
<?php
class Singleton{
private static $_instance = NULL;
private function __construct(){
echo "construct!";
}
public static function getInstance(){
if(self::$_instance === NULL){
self::$_instance = new Singleton();
}
return self::$_instance;
}
public function __clone()
{
die( "No cloning!" );
}
//下边是这个类的其他方法
public function test()
{
echo "test!";
}
}
这段代码就实现了PHP单例模式。是不是现在还是一头雾水呢?这是在干嘛?这样做有什么好处?这个模式怎么用?
3、单例模式初体验
3.1 代码一
$a = new Singleton();//由于__construct是private类型,所以会报错
这说明你是不能这么进行实例化的。
3.2 代码二
$a = Singleton::getInstance();
$a->test();
输出: "construct!test!" 这个也不出我们所料,这个是通过类方法获取到了一个实例,然后执行了test。但是注意这个地方是执行了一下__construct的。
3.3 代码三
$a = Singleton::getInstance();
$a->test();
$b = Singleton::getInstance();
$b->test();
输出:"construct!test!test!"。查看这个结果,你是否发现了点问题呢?这个地方只输出了一个construct。也就是说只对类Singleton进行了一次实例化,而第二个对象$b用的实例和$a用的是同一个,即$a和$b都是同一个对象。这也就是为什么叫单例或者单件了。在同一上下文中只有一个Singleton的实例。
4、单例模式思考
4.1 单例模式保证了一个类只提供一个实例。这个实例是通过getInstance类方法获取到的。
4.2 如果全局资源(比如数据库、配置表、日志等)只能有一个实例的时候,就可以使用单例设计模式。
4.3 对比JAVA单例设计模式,PHP由于没有多线程,所以不用考虑线程安全性。
5、单例设计模式总结
PHP单例模式注意三点:
1)、实现一个private __construct
2)、提供一个获取实例的getInstance
3)、屏蔽clone方法