1、为什么要使用单例模式
有一些对象其实我们只需要一个。比如线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表(register)对象等。
比如说我们在系统运行时候,就需要加载一些配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候new一个,显然是浪费内存并且再赋值没什么意义,所以这个时候我们就需要单例模式。
2、怎么实现单例模式
- 构造函数私有,不允许外部类实例化它
- 类自己创建唯一的实例,并保存到全局属性当中
- 提供公共的静态方法获取这个唯一的实例
- 不允许克隆
3、PHP实现一下
<?php
class Singleton {
private static $instance = null;
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self;
}
return self::$instance;
}
private function __construct()
{
}
private function __clone()
{
}
}
$demo = Singleton::getInstance();
$demo2 = Singleton::getInstance();
echo $demo===$demo2 ? 1 : 2;
echo "\n";
以上代码执行结果
1
4、在Laravel中的应用
在laravel bootstrap/app.php文件中,可以看到几行类似如下的代码。这就是在laravel的容器中注册了几个核心类的单例。当然你也可以自己在 app/Providers 中写一个单例的服务。
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);