单例模式
应用场景一
Windows的Task Manager(任务管理器)、Recycle Bin(回收站)、网站计数器
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
单例要四个条件
1.封锁new的操作,不然外部就会每次new都会生成一个实例,这样单例就没有意义了
2.不被别的类重写我的构造方法
3.有一个静态方法给外部调用,这个接口每次都返回当前的实例,当前有实例化的则返回,没有则实例化
4.封锁clone,不然你在外部可以克隆我的对象,这样单例也没意义了
class sigle
{
// 1 getIns先判断实例
protected static $ins = null;
// 2 封锁 new 操作
// 3 方法前加上final则方法不能被覆盖,类前加final则不能被继承,主要是防止别的类重写__construct,覆盖了,那这里的__construct就无效了,所以要加final
final protected function __construct()
{
}
// 4 留一个接口来new对象
public static function getIns()
{
if (self::$ins === null) {
self::$ins = new self();
}
return self::$ins;
}
// 5 封锁clone,不然外部调用时候再使用clone方法,又会产生新的对象了
final protected function __clone()
{
}
}
/*
注意
1 两个对象是一个的时候才会全等 ===
*/
$s1 = sigle::getIns();
$s2 = sigle::getIns();
if ($s1 === $s2) {
echo '是一个对象';
} else {
echo '不是一个对象';
}