image
1综液、為什么要使用單例模式
有一些對象其實(shí)我們只需要一個(gè)。比如線程池(threadpool)谬莹、緩存(cache)桩了、對話框、處理偏好設(shè)置和注冊表(register)對象等圣猎。
比如說我們在系統(tǒng)運(yùn)行時(shí)候乞而,就需要加載一些配置和屬性,這些配置和屬性是一定存在了欠啤,又是公共的,同時(shí)需要在整個(gè)生命周期中都存在洁段,所以只需要一份就行共郭,這個(gè)時(shí)候如果需要我再需要的時(shí)候new一個(gè),顯然是浪費(fèi)內(nèi)存并且再賦值沒什么意義除嘹,所以這個(gè)時(shí)候我們就需要單例模式。
2叠蝇、怎么實(shí)現(xiàn)單例模式
- 構(gòu)造函數(shù)私有年缎,不允許外部類實(shí)例化它
- 類自己創(chuàng)建唯一的實(shí)例,并保存到全局屬性當(dāng)中
- 提供公共的靜態(tài)方法獲取這個(gè)唯一的實(shí)例
- 不允許克隆
3单芜、PHP實(shí)現(xiàn)一下
<?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";
以上代碼執(zhí)行結(jié)果
1
4、在Laravel中的應(yīng)用
在laravel bootstrap/app.php文件中堂淡,可以看到幾行類似如下的代碼。這就是在laravel的容器中注冊了幾個(gè)核心類的單例淤齐。當(dāng)然你也可以自己在 app/Providers 中寫一個(gè)單例的服務(wù)。
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);